@funstack/ui 0.1.0-alpha.4 → 0.1.0-alpha.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.
Files changed (80) hide show
  1. package/dist/accordion/accordion-item.mjs +2 -2
  2. package/dist/accordion/accordion-panel.mjs +2 -2
  3. package/dist/accordion/accordion-root.mjs +3 -3
  4. package/dist/accordion/accordion-trigger.mjs +2 -2
  5. package/dist/button/button.d.mts +78 -0
  6. package/dist/button/button.d.mts.map +1 -0
  7. package/dist/button/button.mjs +77 -0
  8. package/dist/button/button.mjs.map +1 -0
  9. package/dist/button/index.d.mts +3 -0
  10. package/dist/button/index.mjs +1 -0
  11. package/dist/checkbox/checkbox.mjs +2 -2
  12. package/dist/checkbox-group/checkbox-group-item.mjs +1 -1
  13. package/dist/checkbox-group/checkbox-group-parent.mjs +1 -1
  14. package/dist/checkbox-group/checkbox-group-root.mjs +1 -1
  15. package/dist/combobox/combobox-group.mjs +1 -1
  16. package/dist/combobox/combobox-list.mjs +1 -1
  17. package/dist/combobox/combobox-option.mjs +1 -1
  18. package/dist/combobox/combobox-popup.mjs +2 -2
  19. package/dist/combobox/combobox-root.mjs +3 -3
  20. package/dist/dialog/dialog-close.mjs +1 -1
  21. package/dist/dialog/dialog-form.mjs +1 -1
  22. package/dist/dialog/dialog-popup.mjs +3 -3
  23. package/dist/dialog/dialog-root.mjs +2 -2
  24. package/dist/field/field-root.mjs +3 -3
  25. package/dist/form/form-root.mjs +1 -1
  26. package/dist/index.d.mts +3 -2
  27. package/dist/index.mjs +2 -1
  28. package/dist/internal/render-element.mjs +18 -5
  29. package/dist/internal/render-element.mjs.map +1 -1
  30. package/dist/internal/use-action-trigger.mjs +15 -6
  31. package/dist/internal/use-action-trigger.mjs.map +1 -1
  32. package/dist/internal/use-field-control.mjs +1 -1
  33. package/dist/internal/use-popover-root.mjs +1 -1
  34. package/dist/internal/use-render.mjs +2 -2
  35. package/dist/internal/use-render.mjs.map +1 -1
  36. package/dist/internal/use-roving-focus.mjs +66 -20
  37. package/dist/internal/use-roving-focus.mjs.map +1 -1
  38. package/dist/menu/menu-checkbox-item.mjs +2 -2
  39. package/dist/menu/menu-group.mjs +1 -1
  40. package/dist/menu/menu-item.mjs +1 -1
  41. package/dist/menu/menu-popup.mjs +1 -1
  42. package/dist/menu/menu-radio-group.mjs +1 -1
  43. package/dist/menu/menu-root.mjs +1 -1
  44. package/dist/menu/menu-submenu-trigger.mjs +1 -1
  45. package/dist/menu/menu-trigger.mjs +1 -1
  46. package/dist/number-field/number-field-increment.mjs +1 -1
  47. package/dist/number-field/number-field-input.mjs +1 -1
  48. package/dist/number-field/number-field-root.mjs +4 -4
  49. package/dist/popover/popover-close.mjs +1 -1
  50. package/dist/popover/popover-popup.mjs +2 -2
  51. package/dist/radio-group/radio-group-item.mjs +1 -1
  52. package/dist/radio-group/radio-group-root.mjs +1 -1
  53. package/dist/select/select-root.mjs +1 -1
  54. package/dist/slider/slider-root.mjs +5 -5
  55. package/dist/slider/slider-thumb.mjs +1 -1
  56. package/dist/slider/slider-value.mjs +1 -1
  57. package/dist/switch/switch.mjs +2 -2
  58. package/dist/tabs/tabs-list.mjs +1 -1
  59. package/dist/tabs/tabs-panel.mjs +1 -1
  60. package/dist/tabs/tabs-root.mjs +2 -2
  61. package/dist/tabs/tabs-tab.mjs +1 -1
  62. package/dist/toast/toast-action.mjs +1 -1
  63. package/dist/toast/toast-root.mjs +1 -1
  64. package/dist/toast/toast-viewport.mjs +3 -3
  65. package/dist/toggle/toggle.mjs +3 -3
  66. package/dist/toggle-group/toggle-group-item.mjs +1 -1
  67. package/dist/toggle-group/toggle-group-root.mjs +3 -3
  68. package/dist/toolbar/index.d.mts +4 -5
  69. package/dist/toolbar/index.d.mts.map +1 -1
  70. package/dist/toolbar/index.mjs +3 -4
  71. package/dist/toolbar/index.mjs.map +1 -1
  72. package/dist/toolbar/toolbar-root.mjs +1 -1
  73. package/dist/toolbar/toolbar-separator.mjs +1 -1
  74. package/dist/tooltip/tooltip-root.mjs +4 -2
  75. package/dist/tooltip/tooltip-root.mjs.map +1 -1
  76. package/package.json +2 -1
  77. package/dist/toolbar/toolbar-button.d.mts +0 -42
  78. package/dist/toolbar/toolbar-button.d.mts.map +0 -1
  79. package/dist/toolbar/toolbar-button.mjs +0 -50
  80. package/dist/toolbar/toolbar-button.mjs.map +0 -1
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { dataAttr } from "../internal/data-attr.mjs";
3
+ import { useDevWarning } from "../internal/use-dev-warning.mjs";
3
4
  import { mergeRefs, mergeTokenLists } from "../internal/merge-props.mjs";
4
5
  import { resolveStateValue } from "../internal/render-element.mjs";
5
6
  import { useRender } from "../internal/use-render.mjs";
6
- import { useDevWarning } from "../internal/use-dev-warning.mjs";
7
7
  import { useSliderContext } from "./slider-context.mjs";
8
8
  import { percent, thumbBounds } from "./slider-arithmetic.mjs";
9
9
  import { useEffectEvent, useLayoutEffect, useMemo, useRef } from "react";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { useRender } from "../internal/use-render.mjs";
3
2
  import { useDevWarning } from "../internal/use-dev-warning.mjs";
3
+ import { useRender } from "../internal/use-render.mjs";
4
4
  import { useSliderContext } from "./slider-context.mjs";
5
5
  //#region src/slider/slider-value.tsx
6
6
  /**
@@ -1,10 +1,10 @@
1
1
  "use client";
2
- import { useTransitionBoundary } from "../internal/transition-boundary.mjs";
3
2
  import { createActionDetails } from "../internal/action-details.mjs";
4
3
  import { dataAttr } from "../internal/data-attr.mjs";
4
+ import { useTransitionBoundary } from "../internal/transition-boundary.mjs";
5
+ import { useRender } from "../internal/use-render.mjs";
5
6
  import { transitionTypes } from "../internal/transition-types.mjs";
6
7
  import { useControllableAction } from "../internal/use-controllable-action.mjs";
7
- import { useRender } from "../internal/use-render.mjs";
8
8
  import { fieldInputProps, useFieldControl, useFieldValueChange, useMergedRef } from "../internal/use-field-control.mjs";
9
9
  import { guardCheckableChange, useNativeChecked } from "../internal/use-native-checked.mjs";
10
10
  //#region src/switch/switch.tsx
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { dataAttr } from "../internal/data-attr.mjs";
3
- import { useRender } from "../internal/use-render.mjs";
4
3
  import { useDevWarning } from "../internal/use-dev-warning.mjs";
4
+ import { useRender } from "../internal/use-render.mjs";
5
5
  import { TabsListContext, useTabsContext } from "./tabs-context.mjs";
6
6
  import { useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
7
7
  import { jsx } from "react/jsx-runtime";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { useTransitionBoundary } from "../internal/transition-boundary.mjs";
3
2
  import { dataAttr } from "../internal/data-attr.mjs";
3
+ import { useTransitionBoundary } from "../internal/transition-boundary.mjs";
4
4
  import { useRender } from "../internal/use-render.mjs";
5
5
  import { useTabsContext } from "./tabs-context.mjs";
6
6
  import { panelId, tabId } from "./tabs-ids.mjs";
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { createActionDetails } from "../internal/action-details.mjs";
3
3
  import { dataAttr } from "../internal/data-attr.mjs";
4
+ import { useDevWarning } from "../internal/use-dev-warning.mjs";
5
+ import { useRender } from "../internal/use-render.mjs";
4
6
  import { transitionTypes } from "../internal/transition-types.mjs";
5
7
  import { useControllableAction } from "../internal/use-controllable-action.mjs";
6
- import { useRender } from "../internal/use-render.mjs";
7
- import { useDevWarning } from "../internal/use-dev-warning.mjs";
8
8
  import { TabsContext } from "./tabs-context.mjs";
9
9
  import { tabId } from "./tabs-ids.mjs";
10
10
  import { useId, useMemo, useRef } from "react";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { useTransitionBoundary } from "../internal/transition-boundary.mjs";
3
2
  import { dataAttr } from "../internal/data-attr.mjs";
3
+ import { useTransitionBoundary } from "../internal/transition-boundary.mjs";
4
4
  import { rendersButton, resolveStateValue } from "../internal/render-element.mjs";
5
5
  import { useRender } from "../internal/use-render.mjs";
6
6
  import { TabsListContext, useTabsContext } from "./tabs-context.mjs";
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { createActionDetails } from "../internal/action-details.mjs";
3
3
  import { dataAttr } from "../internal/data-attr.mjs";
4
+ import { useActionTrigger } from "../internal/use-action-trigger.mjs";
4
5
  import { rendersButton } from "../internal/render-element.mjs";
5
6
  import { useRender } from "../internal/use-render.mjs";
6
- import { useActionTrigger } from "../internal/use-action-trigger.mjs";
7
7
  import { useToastRootContext } from "./toast-context.mjs";
8
8
  import { useLayoutEffect, useState } from "react";
9
9
  //#region src/toast/toast-action.tsx
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { dataAttr } from "../internal/data-attr.mjs";
3
- import { useLatest } from "../internal/use-latest.mjs";
4
3
  import { resolveStateValue } from "../internal/render-element.mjs";
5
4
  import { useRender } from "../internal/use-render.mjs";
5
+ import { useLatest } from "../internal/use-latest.mjs";
6
6
  import { exitAnimations } from "../internal/use-exit-animation.mjs";
7
7
  import { ToastRootContext, useToastRootContext, useToastViewportContext } from "./toast-context.mjs";
8
8
  import { Suspense, useCallback, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
@@ -1,17 +1,17 @@
1
1
  "use client";
2
2
  import { createActionDetails } from "../internal/action-details.mjs";
3
3
  import { dataAttr } from "../internal/data-attr.mjs";
4
- import { useLatest } from "../internal/use-latest.mjs";
5
- import { useRender } from "../internal/use-render.mjs";
6
4
  import { useDevWarning } from "../internal/use-dev-warning.mjs";
5
+ import { useRender } from "../internal/use-render.mjs";
6
+ import { useLatest } from "../internal/use-latest.mjs";
7
7
  import { DialogContext } from "../dialog/dialog-context.mjs";
8
8
  import { animationBaseline } from "../internal/use-exit-animation.mjs";
9
9
  import { getServerTopmostModal, getTopmostModal, subscribeModals } from "../internal/modal-registry.mjs";
10
10
  import { ToastViewportContext } from "./toast-context.mjs";
11
11
  import { toast, toastManagerInternals } from "./toast.mjs";
12
12
  import { use, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, useTransition } from "react";
13
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
14
13
  import { createPortal } from "react-dom";
14
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
15
15
  //#region src/toast/toast-viewport.tsx
16
16
  const isDev = process.env.NODE_ENV !== "production";
17
17
  const DEFAULT_HOTKEY = ["F8"];
@@ -1,11 +1,11 @@
1
1
  "use client";
2
- import { useTransitionBoundary } from "../internal/transition-boundary.mjs";
3
2
  import { createActionDetails } from "../internal/action-details.mjs";
4
3
  import { dataAttr } from "../internal/data-attr.mjs";
5
- import { transitionTypes } from "../internal/transition-types.mjs";
6
- import { useControllableAction } from "../internal/use-controllable-action.mjs";
4
+ import { useTransitionBoundary } from "../internal/transition-boundary.mjs";
7
5
  import { rendersButton } from "../internal/render-element.mjs";
8
6
  import { useRender } from "../internal/use-render.mjs";
7
+ import { transitionTypes } from "../internal/transition-types.mjs";
8
+ import { useControllableAction } from "../internal/use-controllable-action.mjs";
9
9
  //#region src/toggle/toggle.tsx
10
10
  /**
11
11
  * A two-state button (WAI-ARIA "Button" pattern, toggle variant). Renders
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { useTransitionBoundary } from "../internal/transition-boundary.mjs";
3
2
  import { dataAttr } from "../internal/data-attr.mjs";
3
+ import { useTransitionBoundary } from "../internal/transition-boundary.mjs";
4
4
  import { rendersButton } from "../internal/render-element.mjs";
5
5
  import { useRender } from "../internal/use-render.mjs";
6
6
  import { useToggleGroupContext } from "./toggle-group-context.mjs";
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  import { createActionDetails } from "../internal/action-details.mjs";
3
3
  import { dataAttr } from "../internal/data-attr.mjs";
4
+ import { useToolbarContext } from "../internal/toolbar-context.mjs";
5
+ import { useDevWarning } from "../internal/use-dev-warning.mjs";
6
+ import { useRender } from "../internal/use-render.mjs";
4
7
  import { transitionTypes } from "../internal/transition-types.mjs";
5
8
  import { useLatest } from "../internal/use-latest.mjs";
6
9
  import { useControllableAction } from "../internal/use-controllable-action.mjs";
7
- import { useRender } from "../internal/use-render.mjs";
8
10
  import { ToggleGroupContext } from "./toggle-group-context.mjs";
9
- import { useToolbarContext } from "../internal/toolbar-context.mjs";
10
- import { useDevWarning } from "../internal/use-dev-warning.mjs";
11
11
  import { useRovingFocus } from "../internal/use-roving-focus.mjs";
12
12
  import { useCallback, useEffectEvent, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
13
13
  import { jsx } from "react/jsx-runtime";
@@ -1,18 +1,17 @@
1
1
  import "../internal/platform-attributes.mjs";
2
- import { ToolbarButton, ToolbarButtonActionDetails, ToolbarButtonProps, ToolbarButtonState } from "./toolbar-button.mjs";
3
2
  import { ToolbarOrientation, ToolbarRoot, ToolbarRootProps, ToolbarRootState } from "./toolbar-root.mjs";
4
3
  import { ToolbarSeparator, ToolbarSeparatorProps, ToolbarSeparatorState } from "./toolbar-separator.mjs";
5
4
  //#region src/toolbar/index.d.ts
6
5
  /**
7
6
  * Toolbar (WAI-ARIA APG Toolbar pattern): `Root` (div role="toolbar") with one Tab stop and
8
- * arrow keys over its focusable descendants, `Button` (an action button, focusable when
9
- * disabled) and `Separator` (hr). Any focusable element is an item: no wrapper parts.
7
+ * arrow keys over its focusable descendants, and `Separator` (hr). Any focusable element is an
8
+ * item: no wrapper parts. A command button is `Button` from `@funstack/ui/button`, which stays
9
+ * focusable when disabled inside a Toolbar (design/components/button.md 7.3).
10
10
  */
11
11
  export declare const Toolbar: {
12
12
  readonly Root: typeof ToolbarRoot;
13
- readonly Button: typeof ToolbarButton;
14
13
  readonly Separator: typeof ToolbarSeparator;
15
14
  };
16
15
  //#endregion
17
- export type { ToolbarButtonActionDetails, ToolbarButtonProps, ToolbarButtonState, ToolbarOrientation, ToolbarRootProps, ToolbarRootState, ToolbarSeparatorProps, ToolbarSeparatorState };
16
+ export type { ToolbarOrientation, ToolbarRootProps, ToolbarRootState, ToolbarSeparatorProps, ToolbarSeparatorState };
18
17
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/toolbar/index.ts"],"mappings":";;;;;;;;;;qBAWa;WACX,aAAI;WACJ,eAAM;WACN,kBAAS"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/toolbar/index.ts"],"mappings":";;;;;;;;;;qBAWa;WACX,aAAI;WACJ,kBAAS"}
@@ -1,15 +1,14 @@
1
- import { ToolbarButton } from "./toolbar-button.mjs";
2
1
  import { ToolbarRoot } from "./toolbar-root.mjs";
3
2
  import { ToolbarSeparator } from "./toolbar-separator.mjs";
4
3
  //#region src/toolbar/index.ts
5
4
  /**
6
5
  * Toolbar (WAI-ARIA APG Toolbar pattern): `Root` (div role="toolbar") with one Tab stop and
7
- * arrow keys over its focusable descendants, `Button` (an action button, focusable when
8
- * disabled) and `Separator` (hr). Any focusable element is an item: no wrapper parts.
6
+ * arrow keys over its focusable descendants, and `Separator` (hr). Any focusable element is an
7
+ * item: no wrapper parts. A command button is `Button` from `@funstack/ui/button`, which stays
8
+ * focusable when disabled inside a Toolbar (design/components/button.md 7.3).
9
9
  */
10
10
  const Toolbar = {
11
11
  Root: ToolbarRoot,
12
- Button: ToolbarButton,
13
12
  Separator: ToolbarSeparator
14
13
  };
15
14
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/toolbar/index.ts"],"sourcesContent":["// Ships the platform attribute typings with this subpath (conventions 7.4). Type-only.\nimport \"../internal/platform-attributes.js\";\nimport { ToolbarButton } from \"./toolbar-button.js\";\nimport { ToolbarRoot } from \"./toolbar-root.js\";\nimport { ToolbarSeparator } from \"./toolbar-separator.js\";\n\n/**\n * Toolbar (WAI-ARIA APG Toolbar pattern): `Root` (div role=\"toolbar\") with one Tab stop and\n * arrow keys over its focusable descendants, `Button` (an action button, focusable when\n * disabled) and `Separator` (hr). Any focusable element is an item: no wrapper parts.\n */\nexport const Toolbar = {\n Root: ToolbarRoot,\n Button: ToolbarButton,\n Separator: ToolbarSeparator,\n} as const;\n\nexport type { ToolbarRootProps, ToolbarRootState, ToolbarOrientation } from \"./toolbar-root.js\";\nexport type {\n ToolbarButtonProps,\n ToolbarButtonState,\n ToolbarButtonActionDetails,\n} from \"./toolbar-button.js\";\nexport type { ToolbarSeparatorProps, ToolbarSeparatorState } from \"./toolbar-separator.js\";\n"],"mappings":";;;;;;;;;AAWA,MAAa,UAAU;CACrB,MAAM;CACN,QAAQ;CACR,WAAW;AACb"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/toolbar/index.ts"],"sourcesContent":["// Ships the platform attribute typings with this subpath (conventions 7.4). Type-only.\nimport \"../internal/platform-attributes.js\";\nimport { ToolbarRoot } from \"./toolbar-root.js\";\nimport { ToolbarSeparator } from \"./toolbar-separator.js\";\n\n/**\n * Toolbar (WAI-ARIA APG Toolbar pattern): `Root` (div role=\"toolbar\") with one Tab stop and\n * arrow keys over its focusable descendants, and `Separator` (hr). Any focusable element is an\n * item: no wrapper parts. A command button is `Button` from `@funstack/ui/button`, which stays\n * focusable when disabled inside a Toolbar (design/components/button.md 7.3).\n */\nexport const Toolbar = {\n Root: ToolbarRoot,\n Separator: ToolbarSeparator,\n} as const;\n\nexport type { ToolbarRootProps, ToolbarRootState, ToolbarOrientation } from \"./toolbar-root.js\";\nexport type { ToolbarSeparatorProps, ToolbarSeparatorState } from \"./toolbar-separator.js\";\n"],"mappings":";;;;;;;;;AAWA,MAAa,UAAU;CACrB,MAAM;CACN,WAAW;AACb"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { useRender } from "../internal/use-render.mjs";
3
2
  import { ToolbarContext } from "../internal/toolbar-context.mjs";
3
+ import { useRender } from "../internal/use-render.mjs";
4
4
  import { useRovingFocus } from "../internal/use-roving-focus.mjs";
5
5
  import { useMemo, useRef, useSyncExternalStore } from "react";
6
6
  import { jsx } from "react/jsx-runtime";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { useRender } from "../internal/use-render.mjs";
3
2
  import { useToolbarContext } from "../internal/toolbar-context.mjs";
3
+ import { useRender } from "../internal/use-render.mjs";
4
4
  //#region src/toolbar/toolbar-separator.tsx
5
5
  /**
6
6
  * `<hr aria-orientation>` between toolbar items: vertical in a horizontal Toolbar, horizontal in
@@ -52,9 +52,11 @@ function TooltipRoot({ delay = 250, closeDelay = 150, disabled = false, provides
52
52
  TooltipRoot.displayName = "TooltipRoot";
53
53
  /**
54
54
  * The containers that move focus among their items with the arrow keys (roving tabindex, or a
55
- * native `focusgroup`): Menu, Tabs, Toolbar, a radio group, and the other APG composites.
55
+ * native `focusgroup`): Menu, Tabs, Toolbar, a radio group, and the other APG composites, plus
56
+ * `role="group"`, which a standalone `ToggleGroup.Root` renders while its roving engine writes
57
+ * the Items' `tabindex` (#75, design/components/toggle-group.md 18).
56
58
  */
57
- const COMPOSITE = "[role=\"menu\"],[role=\"menubar\"],[role=\"tablist\"],[role=\"toolbar\"],[role=\"radiogroup\"],[role=\"listbox\"],[role=\"grid\"],[role=\"treegrid\"],[role=\"tree\"],[focusgroup]";
59
+ const COMPOSITE = "[role=\"menu\"],[role=\"menubar\"],[role=\"tablist\"],[role=\"toolbar\"],[role=\"group\"],[role=\"radiogroup\"],[role=\"listbox\"],[role=\"grid\"],[role=\"treegrid\"],[role=\"tree\"],[focusgroup]";
58
60
  /**
59
61
  * Whether keyboard users can focus the trigger: it is in the tab order, or it is a
60
62
  * roving-tabindex item (`tabindex="-1"` set explicitly, so script can focus it) inside a
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip-root.mjs","names":[],"sources":["../../src/tooltip/tooltip-root.tsx"],"sourcesContent":["\"use client\";\nimport { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { StateValue } from \"../internal/types.js\";\nimport { resolveStateValue } from \"../internal/use-render.js\";\nimport { TooltipContext } from \"./tooltip-context.js\";\nimport type { TooltipContextValue, TooltipProvides } from \"./tooltip-context.js\";\nimport { useTooltipInteraction } from \"./use-tooltip-interaction.js\";\n\nexport type { TooltipProvides } from \"./tooltip-context.js\";\n\nexport interface TooltipRootState {\n readonly disabled: boolean;\n}\n\nexport interface TooltipRootProps {\n /**\n * Milliseconds from hover or keyboard focus to open. Default 250 (Chromium's\n * `interest-delay-start`). The same delay applies to hover and focus.\n */\n delay?: number;\n /** Milliseconds from de-hover or blur to close. Default 150 (Chromium's `interest-delay-end`). */\n closeDelay?: number;\n /** When true the tooltip never opens. The ARIA relation stays in place. */\n disabled?: boolean;\n /**\n * Which accessibility relation the tooltip provides for the trigger.\n * `\"description\"` (default): `aria-describedby`, for triggers that have their own name.\n * `\"name\"`: `aria-labelledby`, for icon-only triggers; do not also set `aria-label`.\n */\n provides?: TooltipProvides;\n children?: StateValue<ReactNode, TooltipRootState>;\n}\n\nconst isDev = process.env.NODE_ENV !== \"production\";\n\nconst FOCUSABLE =\n \"a[href],area[href],button,input,select,textarea,iframe,[tabindex],[contenteditable]\";\n\n/**\n * Owns the popup id, the options and the one interaction effect. Renders no DOM, so it has no\n * `ref`, `className` or `style`. The open state is browser-owned (the popover's top-layer state):\n * there is no `open` prop, no action, and no `data-open`; style with `:popover-open`.\n *\n * Render `Tooltip.Popup` immediately after `Tooltip.Trigger` in DOM order: the HTML spec\n * recommends that reading order for popovers, and some screen readers attach an adjacent tooltip\n * to the wrong control otherwise. This is documented, not enforced.\n */\nexport function TooltipRoot({\n delay = 250,\n closeDelay = 150,\n disabled = false,\n provides = \"description\",\n children,\n}: TooltipRootProps) {\n const popupId = useId();\n const [trigger, setTriggerElement] = useState<HTMLElement | null>(null);\n const [popup, setPopupElement] = useState<HTMLElement | null>(null);\n const [interestForRequested, setInterestForRequested] = useState(false);\n\n useTooltipInteraction(trigger, popup, { delay, closeDelay, disabled, interestForRequested });\n useTooltipDevWarnings(trigger, popup, provides);\n\n const context = useMemo<TooltipContextValue>(\n () => ({\n popupId,\n disabled,\n delay,\n closeDelay,\n provides,\n setTriggerElement,\n setPopupElement,\n setInterestForRequested,\n }),\n [popupId, disabled, delay, closeDelay, provides],\n );\n\n const state: TooltipRootState = { disabled };\n return <TooltipContext value={context}>{resolveStateValue(children, state)}</TooltipContext>;\n}\n\nTooltipRoot.displayName = \"TooltipRoot\";\n\n/**\n * The containers that move focus among their items with the arrow keys (roving tabindex, or a\n * native `focusgroup`): Menu, Tabs, Toolbar, a radio group, and the other APG composites.\n */\nconst COMPOSITE =\n '[role=\"menu\"],[role=\"menubar\"],[role=\"tablist\"],[role=\"toolbar\"],[role=\"radiogroup\"],[role=\"listbox\"],[role=\"grid\"],[role=\"treegrid\"],[role=\"tree\"],[focusgroup]';\n\n/**\n * Whether keyboard users can focus the trigger: it is in the tab order, or it is a\n * roving-tabindex item (`tabindex=\"-1\"` set explicitly, so script can focus it) inside a\n * composite widget that moves focus to it (#57).\n */\nfunction isKeyboardReachable(trigger: HTMLElement): boolean {\n if (trigger.tabIndex >= 0) return true;\n return trigger.hasAttribute(\"tabindex\") && trigger.parentElement?.closest(COMPOSITE) != null;\n}\n\n/** Development-only checks that need the mounted elements (design 12.5). Each fires once. */\nfunction useTooltipDevWarnings(\n trigger: HTMLElement | null,\n popup: HTMLElement | null,\n provides: TooltipProvides,\n): void {\n const warned = useRef({ label: false, focusable: false, interactive: false });\n useEffect(() => {\n if (!isDev) return;\n const w = warned.current;\n if (trigger !== null) {\n if (provides === \"name\" && trigger.hasAttribute(\"aria-label\") && !w.label) {\n w.label = true;\n console.error(\n '[Tooltip] provides=\"name\" together with aria-label on the trigger announces the name twice. Remove aria-label.',\n );\n }\n if (!isKeyboardReachable(trigger) && !w.focusable) {\n w.focusable = true;\n console.error(\n \"[Tooltip] The trigger is not focusable; keyboard users cannot open the tooltip. Render a <button> or a link, or set tabIndex={0}.\",\n );\n }\n }\n if (popup !== null && popup.querySelector(FOCUSABLE) !== null && !w.interactive) {\n w.interactive = true;\n console.error(\n \"[Tooltip] Tooltips must not contain interactive content. Use a non-modal dialog or a popover instead.\",\n );\n }\n }, [trigger, popup, provides]);\n}\n"],"mappings":";;;;;;;AAkCA,MAAM,QAAQ,QAAQ,IAAI,aAAa;AAEvC,MAAM,YACJ;;;;;;;;;;AAWF,SAAgB,YAAY,EAC1B,QAAQ,KACR,aAAa,KACb,WAAW,OACX,WAAW,eACX,YACmB;CACnB,MAAM,UAAU,MAAM;CACtB,MAAM,CAAC,SAAS,qBAAqB,SAA6B,IAAI;CACtE,MAAM,CAAC,OAAO,mBAAmB,SAA6B,IAAI;CAClE,MAAM,CAAC,sBAAsB,2BAA2B,SAAS,KAAK;CAEtE,sBAAsB,SAAS,OAAO;EAAE;EAAO;EAAY;EAAU;CAAqB,CAAC;CAC3F,sBAAsB,SAAS,OAAO,QAAQ;CAE9C,MAAM,UAAU,eACP;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,IACA;EAAC;EAAS;EAAU;EAAO;EAAY;CAAQ,CACjD;CAGA,OAAO,oBAAC,gBAAD;EAAgB,OAAO;EAAU,UAAA,kBAAkB,UAAU,EADlC,SACsC,CAAC;CAAkB,CAAA;AAC7F;AAEA,YAAY,cAAc;;;;;AAM1B,MAAM,YACJ;;;;;;AAOF,SAAS,oBAAoB,SAA+B;CAC1D,IAAI,QAAQ,YAAY,GAAG,OAAO;CAClC,OAAO,QAAQ,aAAa,UAAU,KAAK,QAAQ,eAAe,QAAQ,SAAS,KAAK;AAC1F;;AAGA,SAAS,sBACP,SACA,OACA,UACM;CACN,MAAM,SAAS,OAAO;EAAE,OAAO;EAAO,WAAW;EAAO,aAAa;CAAM,CAAC;CAC5E,gBAAgB;EACd,IAAI,CAAC,OAAO;EACZ,MAAM,IAAI,OAAO;EACjB,IAAI,YAAY,MAAM;GACpB,IAAI,aAAa,UAAU,QAAQ,aAAa,YAAY,KAAK,CAAC,EAAE,OAAO;IACzE,EAAE,QAAQ;IACV,QAAQ,MACN,kHACF;GACF;GACA,IAAI,CAAC,oBAAoB,OAAO,KAAK,CAAC,EAAE,WAAW;IACjD,EAAE,YAAY;IACd,QAAQ,MACN,mIACF;GACF;EACF;EACA,IAAI,UAAU,QAAQ,MAAM,cAAc,SAAS,MAAM,QAAQ,CAAC,EAAE,aAAa;GAC/E,EAAE,cAAc;GAChB,QAAQ,MACN,uGACF;EACF;CACF,GAAG;EAAC;EAAS;EAAO;CAAQ,CAAC;AAC/B"}
1
+ {"version":3,"file":"tooltip-root.mjs","names":[],"sources":["../../src/tooltip/tooltip-root.tsx"],"sourcesContent":["\"use client\";\nimport { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { StateValue } from \"../internal/types.js\";\nimport { resolveStateValue } from \"../internal/use-render.js\";\nimport { TooltipContext } from \"./tooltip-context.js\";\nimport type { TooltipContextValue, TooltipProvides } from \"./tooltip-context.js\";\nimport { useTooltipInteraction } from \"./use-tooltip-interaction.js\";\n\nexport type { TooltipProvides } from \"./tooltip-context.js\";\n\nexport interface TooltipRootState {\n readonly disabled: boolean;\n}\n\nexport interface TooltipRootProps {\n /**\n * Milliseconds from hover or keyboard focus to open. Default 250 (Chromium's\n * `interest-delay-start`). The same delay applies to hover and focus.\n */\n delay?: number;\n /** Milliseconds from de-hover or blur to close. Default 150 (Chromium's `interest-delay-end`). */\n closeDelay?: number;\n /** When true the tooltip never opens. The ARIA relation stays in place. */\n disabled?: boolean;\n /**\n * Which accessibility relation the tooltip provides for the trigger.\n * `\"description\"` (default): `aria-describedby`, for triggers that have their own name.\n * `\"name\"`: `aria-labelledby`, for icon-only triggers; do not also set `aria-label`.\n */\n provides?: TooltipProvides;\n children?: StateValue<ReactNode, TooltipRootState>;\n}\n\nconst isDev = process.env.NODE_ENV !== \"production\";\n\nconst FOCUSABLE =\n \"a[href],area[href],button,input,select,textarea,iframe,[tabindex],[contenteditable]\";\n\n/**\n * Owns the popup id, the options and the one interaction effect. Renders no DOM, so it has no\n * `ref`, `className` or `style`. The open state is browser-owned (the popover's top-layer state):\n * there is no `open` prop, no action, and no `data-open`; style with `:popover-open`.\n *\n * Render `Tooltip.Popup` immediately after `Tooltip.Trigger` in DOM order: the HTML spec\n * recommends that reading order for popovers, and some screen readers attach an adjacent tooltip\n * to the wrong control otherwise. This is documented, not enforced.\n */\nexport function TooltipRoot({\n delay = 250,\n closeDelay = 150,\n disabled = false,\n provides = \"description\",\n children,\n}: TooltipRootProps) {\n const popupId = useId();\n const [trigger, setTriggerElement] = useState<HTMLElement | null>(null);\n const [popup, setPopupElement] = useState<HTMLElement | null>(null);\n const [interestForRequested, setInterestForRequested] = useState(false);\n\n useTooltipInteraction(trigger, popup, { delay, closeDelay, disabled, interestForRequested });\n useTooltipDevWarnings(trigger, popup, provides);\n\n const context = useMemo<TooltipContextValue>(\n () => ({\n popupId,\n disabled,\n delay,\n closeDelay,\n provides,\n setTriggerElement,\n setPopupElement,\n setInterestForRequested,\n }),\n [popupId, disabled, delay, closeDelay, provides],\n );\n\n const state: TooltipRootState = { disabled };\n return <TooltipContext value={context}>{resolveStateValue(children, state)}</TooltipContext>;\n}\n\nTooltipRoot.displayName = \"TooltipRoot\";\n\n/**\n * The containers that move focus among their items with the arrow keys (roving tabindex, or a\n * native `focusgroup`): Menu, Tabs, Toolbar, a radio group, and the other APG composites, plus\n * `role=\"group\"`, which a standalone `ToggleGroup.Root` renders while its roving engine writes\n * the Items' `tabindex` (#75, design/components/toggle-group.md 18).\n */\nconst COMPOSITE =\n '[role=\"menu\"],[role=\"menubar\"],[role=\"tablist\"],[role=\"toolbar\"],[role=\"group\"],[role=\"radiogroup\"],[role=\"listbox\"],[role=\"grid\"],[role=\"treegrid\"],[role=\"tree\"],[focusgroup]';\n\n/**\n * Whether keyboard users can focus the trigger: it is in the tab order, or it is a\n * roving-tabindex item (`tabindex=\"-1\"` set explicitly, so script can focus it) inside a\n * composite widget that moves focus to it (#57).\n */\nfunction isKeyboardReachable(trigger: HTMLElement): boolean {\n if (trigger.tabIndex >= 0) return true;\n return trigger.hasAttribute(\"tabindex\") && trigger.parentElement?.closest(COMPOSITE) != null;\n}\n\n/** Development-only checks that need the mounted elements (design 12.5). Each fires once. */\nfunction useTooltipDevWarnings(\n trigger: HTMLElement | null,\n popup: HTMLElement | null,\n provides: TooltipProvides,\n): void {\n const warned = useRef({ label: false, focusable: false, interactive: false });\n useEffect(() => {\n if (!isDev) return;\n const w = warned.current;\n if (trigger !== null) {\n if (provides === \"name\" && trigger.hasAttribute(\"aria-label\") && !w.label) {\n w.label = true;\n console.error(\n '[Tooltip] provides=\"name\" together with aria-label on the trigger announces the name twice. Remove aria-label.',\n );\n }\n if (!isKeyboardReachable(trigger) && !w.focusable) {\n w.focusable = true;\n console.error(\n \"[Tooltip] The trigger is not focusable; keyboard users cannot open the tooltip. Render a <button> or a link, or set tabIndex={0}.\",\n );\n }\n }\n if (popup !== null && popup.querySelector(FOCUSABLE) !== null && !w.interactive) {\n w.interactive = true;\n console.error(\n \"[Tooltip] Tooltips must not contain interactive content. Use a non-modal dialog or a popover instead.\",\n );\n }\n }, [trigger, popup, provides]);\n}\n"],"mappings":";;;;;;;AAkCA,MAAM,QAAQ,QAAQ,IAAI,aAAa;AAEvC,MAAM,YACJ;;;;;;;;;;AAWF,SAAgB,YAAY,EAC1B,QAAQ,KACR,aAAa,KACb,WAAW,OACX,WAAW,eACX,YACmB;CACnB,MAAM,UAAU,MAAM;CACtB,MAAM,CAAC,SAAS,qBAAqB,SAA6B,IAAI;CACtE,MAAM,CAAC,OAAO,mBAAmB,SAA6B,IAAI;CAClE,MAAM,CAAC,sBAAsB,2BAA2B,SAAS,KAAK;CAEtE,sBAAsB,SAAS,OAAO;EAAE;EAAO;EAAY;EAAU;CAAqB,CAAC;CAC3F,sBAAsB,SAAS,OAAO,QAAQ;CAE9C,MAAM,UAAU,eACP;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,IACA;EAAC;EAAS;EAAU;EAAO;EAAY;CAAQ,CACjD;CAGA,OAAO,oBAAC,gBAAD;EAAgB,OAAO;EAAU,UAAA,kBAAkB,UAAU,EADlC,SACsC,CAAC;CAAkB,CAAA;AAC7F;AAEA,YAAY,cAAc;;;;;;;AAQ1B,MAAM,YACJ;;;;;;AAOF,SAAS,oBAAoB,SAA+B;CAC1D,IAAI,QAAQ,YAAY,GAAG,OAAO;CAClC,OAAO,QAAQ,aAAa,UAAU,KAAK,QAAQ,eAAe,QAAQ,SAAS,KAAK;AAC1F;;AAGA,SAAS,sBACP,SACA,OACA,UACM;CACN,MAAM,SAAS,OAAO;EAAE,OAAO;EAAO,WAAW;EAAO,aAAa;CAAM,CAAC;CAC5E,gBAAgB;EACd,IAAI,CAAC,OAAO;EACZ,MAAM,IAAI,OAAO;EACjB,IAAI,YAAY,MAAM;GACpB,IAAI,aAAa,UAAU,QAAQ,aAAa,YAAY,KAAK,CAAC,EAAE,OAAO;IACzE,EAAE,QAAQ;IACV,QAAQ,MACN,kHACF;GACF;GACA,IAAI,CAAC,oBAAoB,OAAO,KAAK,CAAC,EAAE,WAAW;IACjD,EAAE,YAAY;IACd,QAAQ,MACN,mIACF;GACF;EACF;EACA,IAAI,UAAU,QAAQ,MAAM,cAAc,SAAS,MAAM,QAAQ,CAAC,EAAE,aAAa;GAC/E,EAAE,cAAc;GAChB,QAAQ,MACN,uGACF;EACF;CACF,GAAG;EAAC;EAAS;EAAO;CAAQ,CAAC;AAC/B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@funstack/ui",
3
- "version": "0.1.0-alpha.4",
3
+ "version": "0.1.0-alpha.6",
4
4
  "description": "Headless UI library for React — the first Async React-native UI library",
5
5
  "keywords": [
6
6
  "components",
@@ -30,6 +30,7 @@
30
30
  "exports": {
31
31
  ".": "./dist/index.mjs",
32
32
  "./accordion": "./dist/accordion/index.mjs",
33
+ "./button": "./dist/button/index.mjs",
33
34
  "./checkbox": "./dist/checkbox/index.mjs",
34
35
  "./checkbox-group": "./dist/checkbox-group/index.mjs",
35
36
  "./combobox": "./dist/combobox/index.mjs",
@@ -1,42 +0,0 @@
1
- import { Action, ActionDetails, RenderProp, StateValue } from "../internal/types.mjs";
2
- import { CSSProperties, ComponentPropsWithRef, ReactNode, ViewTransitionClass } from "react";
3
- //#region src/toolbar/toolbar-button.d.ts
4
- /** Details passed to `Toolbar.Button`'s `action`. */
5
- export interface ToolbarButtonActionDetails extends ActionDetails {}
6
- export interface ToolbarButtonState {
7
- /** This button's action is in flight. */
8
- readonly pending: boolean;
9
- readonly disabled: boolean;
10
- }
11
- export interface ToolbarButtonProps extends Omit<ComponentPropsWithRef<"button">, "onClick" | "type" | "tabIndex" | "aria-disabled" | "className" | "style" | "children"> {
12
- /** Runs inside this button's own transition on click, Enter or Space. Sync or async; rejections reach the nearest Error Boundary. */
13
- action?: Action<[details: ToolbarButtonActionDetails]>;
14
- /**
15
- * `aria-disabled="true"`: the button stays focusable and in the arrow-key sequence so
16
- * assistive technology still finds it (APG Toolbar example), and never dispatches.
17
- */
18
- disabled?: boolean;
19
- /**
20
- * Forwarded as `default` to the button's `<ViewTransition>`: animates the commit that ends the
21
- * action (content keyed on `pending`), not a click. Static; any value makes a mount inside a
22
- * transition start a document view transition (issue #35).
23
- */
24
- transition?: ViewTransitionClass;
25
- className?: StateValue<string | undefined, ToolbarButtonState>;
26
- style?: StateValue<CSSProperties | undefined, ToolbarButtonState>;
27
- children?: StateValue<ReactNode, ToolbarButtonState>;
28
- render?: RenderProp<ComponentPropsWithRef<"button">, ToolbarButtonState>;
29
- }
30
- /**
31
- * A toolbar command: `<button type="button">` that runs `action` in its own transition
32
- * (`data-pending` while it runs). Disabled is `aria-disabled`, so it stays focusable.
33
- *
34
- * Owned keys (conventions 1.2): `type` (on a `<button>` only), `aria-disabled`, `data-pending`,
35
- * `data-disabled`, `onClick`.
36
- */
37
- export declare function ToolbarButton({ action, disabled, transition, className, style, children, render, ...rest }: ToolbarButtonProps): ReactNode;
38
- export declare namespace ToolbarButton {
39
- var displayName: string;
40
- }
41
- //#endregion
42
- //# sourceMappingURL=toolbar-button.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toolbar-button.d.mts","names":[],"sources":["../../src/toolbar/toolbar-button.tsx"],"mappings":";;;;iBAgBiB,mCAAmC;iBAEnC;;WAEN;WACA;;iBAGM,2BAA2B,KAC1C;;EAIA,SAAS,QAAQ,SAAS;;;;;EAK1B;;;;;;EAMA,aAAa;EACb,YAAY,+BAA+B;EAC3C,QAAQ,WAAW,2BAA2B;EAC9C,WAAW,WAAW,WAAW;EACjC,SAAS,WAAW,iCAAiC;;;;;;;;;wBAUvC,gBACd,QACA,UACA,YACA,WACA,OACA,UACA,WACG,QACF,qBAAkB;yBATL"}
@@ -1,50 +0,0 @@
1
- "use client";
2
- import { useTransitionBoundary } from "../internal/transition-boundary.mjs";
3
- import { createActionDetails } from "../internal/action-details.mjs";
4
- import { dataAttr } from "../internal/data-attr.mjs";
5
- import { rendersButton } from "../internal/render-element.mjs";
6
- import { useRender } from "../internal/use-render.mjs";
7
- import { useActionTrigger } from "../internal/use-action-trigger.mjs";
8
- //#region src/toolbar/toolbar-button.tsx
9
- /**
10
- * A toolbar command: `<button type="button">` that runs `action` in its own transition
11
- * (`data-pending` while it runs). Disabled is `aria-disabled`, so it stays focusable.
12
- *
13
- * Owned keys (conventions 1.2): `type` (on a `<button>` only), `aria-disabled`, `data-pending`,
14
- * `data-disabled`, `onClick`.
15
- */
16
- function ToolbarButton({ action, disabled = false, transition, className, style, children, render, ...rest }) {
17
- const { pending, run } = useActionTrigger();
18
- const element = useRender({
19
- defaultElement: "button",
20
- render,
21
- state: {
22
- pending,
23
- disabled
24
- },
25
- className,
26
- style,
27
- children,
28
- props: rest,
29
- libraryProps: {
30
- ...rendersButton(render) && { type: "button" },
31
- "aria-disabled": disabled ? true : void 0,
32
- "data-pending": dataAttr(pending),
33
- "data-disabled": dataAttr(disabled),
34
- onClick: (event) => {
35
- if (disabled) {
36
- event.preventDefault();
37
- return;
38
- }
39
- const details = createActionDetails(event.nativeEvent, {});
40
- run(() => action?.(details));
41
- }
42
- }
43
- });
44
- return useTransitionBoundary("Toolbar.Button", transition, element);
45
- }
46
- ToolbarButton.displayName = "ToolbarButton";
47
- //#endregion
48
- export { ToolbarButton };
49
-
50
- //# sourceMappingURL=toolbar-button.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toolbar-button.mjs","names":[],"sources":["../../src/toolbar/toolbar-button.tsx"],"sourcesContent":["\"use client\";\nimport type {\n ComponentPropsWithRef,\n CSSProperties,\n MouseEvent,\n ReactNode,\n ViewTransitionClass,\n} from \"react\";\nimport { createActionDetails } from \"../internal/action-details.js\";\nimport { dataAttr } from \"../internal/data-attr.js\";\nimport { useTransitionBoundary } from \"../internal/transition-boundary.js\";\nimport type { Action, ActionDetails, RenderProp, StateValue } from \"../internal/types.js\";\nimport { useActionTrigger } from \"../internal/use-action-trigger.js\";\nimport { rendersButton, useRender } from \"../internal/use-render.js\";\n\n/** Details passed to `Toolbar.Button`'s `action`. */\nexport interface ToolbarButtonActionDetails extends ActionDetails {}\n\nexport interface ToolbarButtonState {\n /** This button's action is in flight. */\n readonly pending: boolean;\n readonly disabled: boolean;\n}\n\nexport interface ToolbarButtonProps extends Omit<\n ComponentPropsWithRef<\"button\">,\n \"onClick\" | \"type\" | \"tabIndex\" | \"aria-disabled\" | \"className\" | \"style\" | \"children\"\n> {\n /** Runs inside this button's own transition on click, Enter or Space. Sync or async; rejections reach the nearest Error Boundary. */\n action?: Action<[details: ToolbarButtonActionDetails]>;\n /**\n * `aria-disabled=\"true\"`: the button stays focusable and in the arrow-key sequence so\n * assistive technology still finds it (APG Toolbar example), and never dispatches.\n */\n disabled?: boolean;\n /**\n * Forwarded as `default` to the button's `<ViewTransition>`: animates the commit that ends the\n * action (content keyed on `pending`), not a click. Static; any value makes a mount inside a\n * transition start a document view transition (issue #35).\n */\n transition?: ViewTransitionClass;\n className?: StateValue<string | undefined, ToolbarButtonState>;\n style?: StateValue<CSSProperties | undefined, ToolbarButtonState>;\n children?: StateValue<ReactNode, ToolbarButtonState>;\n render?: RenderProp<ComponentPropsWithRef<\"button\">, ToolbarButtonState>;\n}\n\n/**\n * A toolbar command: `<button type=\"button\">` that runs `action` in its own transition\n * (`data-pending` while it runs). Disabled is `aria-disabled`, so it stays focusable.\n *\n * Owned keys (conventions 1.2): `type` (on a `<button>` only), `aria-disabled`, `data-pending`,\n * `data-disabled`, `onClick`.\n */\nexport function ToolbarButton({\n action,\n disabled = false,\n transition,\n className,\n style,\n children,\n render,\n ...rest\n}: ToolbarButtonProps) {\n const { pending, run } = useActionTrigger();\n const state: ToolbarButtonState = { pending, disabled };\n\n const element = useRender<ComponentPropsWithRef<\"button\">, ToolbarButtonState>({\n defaultElement: \"button\",\n render,\n state,\n className,\n style,\n children,\n props: rest,\n libraryProps: {\n ...(rendersButton(render) && { type: \"button\" as const }),\n \"aria-disabled\": disabled ? true : undefined,\n \"data-pending\": dataAttr(pending),\n \"data-disabled\": dataAttr(disabled),\n onClick: (event: MouseEvent<HTMLButtonElement>) => {\n if (disabled) {\n // A disabled link must not navigate either.\n event.preventDefault();\n return;\n }\n const details: ToolbarButtonActionDetails = createActionDetails(event.nativeEvent, {});\n run(() => action?.(details));\n },\n },\n });\n\n return useTransitionBoundary(\"Toolbar.Button\", transition, element);\n}\n\nToolbarButton.displayName = \"ToolbarButton\";\n"],"mappings":";;;;;;;;;;;;;;;AAsDA,SAAgB,cAAc,EAC5B,QACA,WAAW,OACX,YACA,WACA,OACA,UACA,QACA,GAAG,QACkB;CACrB,MAAM,EAAE,SAAS,QAAQ,iBAAiB;CAG1C,MAAM,UAAU,UAA+D;EAC7E,gBAAgB;EAChB;EACA,OAAA;GALkC;GAAS;EAKvC;EACJ;EACA;EACA;EACA,OAAO;EACP,cAAc;GACZ,GAAI,cAAc,MAAM,KAAK,EAAE,MAAM,SAAkB;GACvD,iBAAiB,WAAW,OAAO,KAAA;GACnC,gBAAgB,SAAS,OAAO;GAChC,iBAAiB,SAAS,QAAQ;GAClC,UAAU,UAAyC;IACjD,IAAI,UAAU;KAEZ,MAAM,eAAe;KACrB;IACF;IACA,MAAM,UAAsC,oBAAoB,MAAM,aAAa,CAAC,CAAC;IACrF,UAAU,SAAS,OAAO,CAAC;GAC7B;EACF;CACF,CAAC;CAED,OAAO,sBAAsB,kBAAkB,YAAY,OAAO;AACpE;AAEA,cAAc,cAAc"}