@hjmds/react 1.34.0 → 1.35.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 (141) hide show
  1. package/dist/actions.d.ts +23 -2
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js +61 -6
  4. package/dist/actions.js.map +1 -1
  5. package/dist/advanced-display.d.ts +35 -2
  6. package/dist/advanced-display.d.ts.map +1 -1
  7. package/dist/advanced-display.js +28 -9
  8. package/dist/advanced-display.js.map +1 -1
  9. package/dist/anchor.d.ts +3 -1
  10. package/dist/anchor.d.ts.map +1 -1
  11. package/dist/anchor.js +5 -5
  12. package/dist/anchor.js.map +1 -1
  13. package/dist/auth-screen.d.ts.map +1 -1
  14. package/dist/auth-screen.js +5 -2
  15. package/dist/auth-screen.js.map +1 -1
  16. package/dist/avatar-blobatar-motion.d.ts.map +1 -1
  17. package/dist/avatar-blobatar-motion.js +2 -1
  18. package/dist/avatar-blobatar-motion.js.map +1 -1
  19. package/dist/avatar-blobatar.d.ts.map +1 -1
  20. package/dist/avatar-blobatar.js +2 -1
  21. package/dist/avatar-blobatar.js.map +1 -1
  22. package/dist/bottom-cta.d.ts +8 -1
  23. package/dist/bottom-cta.d.ts.map +1 -1
  24. package/dist/bottom-cta.js +6 -2
  25. package/dist/bottom-cta.js.map +1 -1
  26. package/dist/carousel-motion.d.ts.map +1 -1
  27. package/dist/carousel-motion.js +11 -2
  28. package/dist/carousel-motion.js.map +1 -1
  29. package/dist/carousel.d.ts +10 -0
  30. package/dist/carousel.d.ts.map +1 -1
  31. package/dist/carousel.js +23 -7
  32. package/dist/carousel.js.map +1 -1
  33. package/dist/collapsible.d.ts +6 -0
  34. package/dist/collapsible.d.ts.map +1 -1
  35. package/dist/collapsible.js +22 -20
  36. package/dist/collapsible.js.map +1 -1
  37. package/dist/collection-editing.d.ts +3 -1
  38. package/dist/collection-editing.d.ts.map +1 -1
  39. package/dist/collection-editing.js +5 -5
  40. package/dist/collection-editing.js.map +1 -1
  41. package/dist/collection-rail.d.ts +4 -4
  42. package/dist/collection-rail.d.ts.map +1 -1
  43. package/dist/collection-rail.js.map +1 -1
  44. package/dist/conversation-row.d.ts.map +1 -1
  45. package/dist/conversation-row.js +4 -1
  46. package/dist/conversation-row.js.map +1 -1
  47. package/dist/data-table.d.ts +2 -0
  48. package/dist/data-table.d.ts.map +1 -1
  49. package/dist/data-table.js +2 -2
  50. package/dist/data-table.js.map +1 -1
  51. package/dist/display.d.ts +60 -5
  52. package/dist/display.d.ts.map +1 -1
  53. package/dist/display.js +32 -9
  54. package/dist/display.js.map +1 -1
  55. package/dist/evidence.d.ts +1 -1
  56. package/dist/evidence.d.ts.map +1 -1
  57. package/dist/evidence.js +2 -1
  58. package/dist/evidence.js.map +1 -1
  59. package/dist/feedback.d.ts +5 -0
  60. package/dist/feedback.d.ts.map +1 -1
  61. package/dist/feedback.js +7 -5
  62. package/dist/feedback.js.map +1 -1
  63. package/dist/floating-action-button.js +1 -1
  64. package/dist/floating-action-button.js.map +1 -1
  65. package/dist/forms.d.ts.map +1 -1
  66. package/dist/forms.js +4 -4
  67. package/dist/forms.js.map +1 -1
  68. package/dist/image-choice.js +3 -3
  69. package/dist/image-choice.js.map +1 -1
  70. package/dist/index.d.ts +5 -4
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +5 -4
  73. package/dist/index.js.map +1 -1
  74. package/dist/internal/initial-focus.d.ts +6 -0
  75. package/dist/internal/initial-focus.d.ts.map +1 -1
  76. package/dist/internal/initial-focus.js +6 -0
  77. package/dist/internal/initial-focus.js.map +1 -1
  78. package/dist/internal/pending-content.d.ts +19 -0
  79. package/dist/internal/pending-content.d.ts.map +1 -0
  80. package/dist/internal/pending-content.js +34 -0
  81. package/dist/internal/pending-content.js.map +1 -0
  82. package/dist/internal/screen-footer.d.ts +4 -2
  83. package/dist/internal/screen-footer.d.ts.map +1 -1
  84. package/dist/internal/screen-footer.js +2 -2
  85. package/dist/internal/screen-footer.js.map +1 -1
  86. package/dist/internal.d.ts +9 -1
  87. package/dist/internal.d.ts.map +1 -1
  88. package/dist/internal.js +4 -0
  89. package/dist/internal.js.map +1 -1
  90. package/dist/navigation.d.ts.map +1 -1
  91. package/dist/navigation.js +58 -4
  92. package/dist/navigation.js.map +1 -1
  93. package/dist/number-field.d.ts.map +1 -1
  94. package/dist/number-field.js +4 -3
  95. package/dist/number-field.js.map +1 -1
  96. package/dist/overlays.d.ts +4 -0
  97. package/dist/overlays.d.ts.map +1 -1
  98. package/dist/overlays.js +46 -18
  99. package/dist/overlays.js.map +1 -1
  100. package/dist/public-exports.generated.d.ts +6 -0
  101. package/dist/public-exports.generated.d.ts.map +1 -1
  102. package/dist/public-exports.generated.js +18 -0
  103. package/dist/public-exports.generated.js.map +1 -1
  104. package/dist/screen-flows.d.ts +13 -5
  105. package/dist/screen-flows.d.ts.map +1 -1
  106. package/dist/screen-flows.js +25 -14
  107. package/dist/screen-flows.js.map +1 -1
  108. package/dist/screens.d.ts +18 -5
  109. package/dist/screens.d.ts.map +1 -1
  110. package/dist/screens.js +22 -11
  111. package/dist/screens.js.map +1 -1
  112. package/dist/selection.d.ts +22 -0
  113. package/dist/selection.d.ts.map +1 -1
  114. package/dist/selection.js +32 -9
  115. package/dist/selection.js.map +1 -1
  116. package/dist/shortcut-rail.d.ts +27 -0
  117. package/dist/shortcut-rail.d.ts.map +1 -0
  118. package/dist/shortcut-rail.js +37 -0
  119. package/dist/shortcut-rail.js.map +1 -0
  120. package/dist/steps.d.ts +5 -2
  121. package/dist/steps.d.ts.map +1 -1
  122. package/dist/steps.js +3 -3
  123. package/dist/steps.js.map +1 -1
  124. package/dist/styles.css +223 -48
  125. package/dist/styles.layered.css +223 -48
  126. package/dist/task-list.d.ts +3 -1
  127. package/dist/task-list.d.ts.map +1 -1
  128. package/dist/task-list.js +2 -2
  129. package/dist/task-list.js.map +1 -1
  130. package/dist/theme.d.ts.map +1 -1
  131. package/dist/theme.js +1 -0
  132. package/dist/theme.js.map +1 -1
  133. package/dist/time-picker.d.ts +9 -0
  134. package/dist/time-picker.d.ts.map +1 -0
  135. package/dist/time-picker.js +74 -0
  136. package/dist/time-picker.js.map +1 -0
  137. package/dist/top-bar.d.ts +4 -0
  138. package/dist/top-bar.d.ts.map +1 -1
  139. package/dist/top-bar.js +2 -2
  140. package/dist/top-bar.js.map +1 -1
  141. package/package.json +26 -15
@@ -1 +1 @@
1
- {"version":3,"file":"number-field.d.ts","sourceRoot":"","sources":["../src/number-field.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAQL,KAAK,mBAAmB,EAExB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAGtE,KAAK,sBAAsB,GAAG,IAAI,CAChC,mBAAmB,CAAC,gBAAgB,CAAC,EACnC,mBAAmB,GACnB,eAAe,GACf,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,UAAU,GACV,WAAW,GACX,cAAc,GACd,UAAU,GACV,KAAK,GACL,KAAK,GACL,UAAU,GACV,UAAU,GACV,UAAU,GACV,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,OAAO,CACV,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,sBAAsB,GACnD,QAAQ,CAAC;IACP,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAWL;;;GAGG;AACH,eAAO,MAAM,WAAW;WAzCb,SAAS;SACX,MAAM;SACN,MAAM;WACJ,MAAM;YACL,gBAAgB;mBACT,gBAAgB;oBACf,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI;kBACnC,SAAS;YACf,SAAS;eACN,OAAO;eACP,OAAO;eACP,OAAO;WACX,eAAe;IACtB,kEAAkE;oBAClD,MAAM;IACtB,kEAAkE;oBAClD,MAAM;IACtB,iFAAiF;mBAClE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM;gBAC5B,MAAM;qBACD,MAAM;IACvB;;;OAGG;kBACW,uBAAuB;qDA4NxC,CAAC"}
1
+ {"version":3,"file":"number-field.d.ts","sourceRoot":"","sources":["../src/number-field.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAQL,KAAK,mBAAmB,EAExB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAGtE,KAAK,sBAAsB,GAAG,IAAI,CAChC,mBAAmB,CAAC,gBAAgB,CAAC,EACnC,mBAAmB,GACnB,eAAe,GACf,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,UAAU,GACV,WAAW,GACX,cAAc,GACd,UAAU,GACV,KAAK,GACL,KAAK,GACL,UAAU,GACV,UAAU,GACV,UAAU,GACV,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,OAAO,CACV,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,sBAAsB,GACnD,QAAQ,CAAC;IACP,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC,CAAC;AAWL;;;GAGG;AACH,eAAO,MAAM,WAAW;WAzCb,SAAS;SACX,MAAM;SACN,MAAM;WACJ,MAAM;YACL,gBAAgB;mBACT,gBAAgB;oBACf,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI;kBACnC,SAAS;YACf,SAAS;eACN,OAAO;eACP,OAAO;eACP,OAAO;WACX,eAAe;IACtB,kEAAkE;oBAClD,MAAM;IACtB,kEAAkE;oBAClD,MAAM;IACtB,iFAAiF;mBAClE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM;gBAC5B,MAAM;qBACD,MAAM;IACvB;;;OAGG;kBACW,uBAAuB;qDA8NxC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { commitNumberFieldInput, numberFieldRecipe, parseNumberFieldInput, resolveNumberFieldDescriptor, resolveNumberFieldInputStepperState, stepNumberFieldInput, } from "@hjmds/design-contracts/components/number-field";
3
3
  import { forwardRef, useEffect, useId, useRef, useState, } from "react";
4
- import { classNames, composeRefs, useControllableState } from "./internal.js";
4
+ import { classNames, composeRefs, isAriaInvalid, useControllableState } from "./internal.js";
5
5
  import { FieldError } from "./internal/field-error.js";
6
6
  function valueToInput(value) {
7
7
  return value === null ? "" : String(value);
@@ -89,9 +89,10 @@ export const NumberField = forwardRef(function NumberField({ id, label, min, max
89
89
  }
90
90
  };
91
91
  const unavailable = disabled || readOnly;
92
+ const hasInvalidState = Boolean(error) || isAriaInvalid(ariaInvalid);
92
93
  const state = disabled
93
94
  ? "disabled"
94
- : error || ariaInvalid
95
+ : hasInvalidState
95
96
  ? "invalid"
96
97
  : focused
97
98
  ? "focused"
@@ -110,6 +111,6 @@ export const NumberField = forwardRef(function NumberField({ id, label, min, max
110
111
  // recipe (numberFieldRecipe.states), as on Native — the frame default is fieldRecipe's.
111
112
  style: disabled
112
113
  ? { ...layoutStyle, "--hjm-field-disabled-opacity": numberFieldRecipe.states.disabledOpacity }
113
- : layoutStyle, "data-availability": disabled ? "disabled" : readOnly ? "readOnly" : "enabled", "data-size": size, "data-state": state, "data-value": currentValue === null ? "empty" : "filled", children: [_jsxs("label", { className: "hjm-field__label", htmlFor: controlId, children: [label, required ? _jsx("span", { "aria-hidden": "true", children: " *" }) : null] }), _jsxs("div", { className: "hjm-field__control hjm-number-field__control", children: [_jsx("button", { type: "button", "aria-controls": controlId, "aria-label": decrementLabel, className: "hjm-number-field__stepper", "data-direction": "decrement", disabled: unavailable || stepper.decrementDisabled, onClick: () => stepValue("decrement"), onMouseDown: (event) => event.preventDefault(), tabIndex: -1, children: _jsx("span", { "aria-hidden": "true", children: "\u2212" }) }), _jsx("input", { ...inputProps, ref: composeRefs(inputRef, forwardedRef), id: controlId, type: "text", role: "spinbutton", className: classNames("hjm-field__input", "hjm-number-field__input", inputClassName), value: draft, inputMode: inputMode ?? defaultInputMode(min, descriptor.step), required: required, disabled: disabled, readOnly: readOnly, "aria-invalid": error ? true : ariaInvalid, "aria-describedby": describedBy, ...(error ? { "aria-errormessage": errorId } : {}), "aria-valuemin": min, "aria-valuemax": max, ...(announcedValue === null ? {} : { "aria-valuenow": announcedValue }), ...(valueText === undefined ? {} : { "aria-valuetext": valueText }), onChange: (event) => setDraft(event.currentTarget.value), onFocus: handleFocus, onBlur: handleBlur, onKeyDown: handleKeyDown }), _jsx("button", { type: "button", "aria-controls": controlId, "aria-label": incrementLabel, className: "hjm-number-field__stepper", "data-direction": "increment", disabled: unavailable || stepper.incrementDisabled, onClick: () => stepValue("increment"), onMouseDown: (event) => event.preventDefault(), tabIndex: -1, children: _jsx("span", { "aria-hidden": "true", children: "+" }) })] }), description && !error ? (_jsx("div", { id: descriptionId, className: "hjm-field__description", children: description })) : null, _jsx(FieldError, { id: errorId, error: error })] }));
114
+ : layoutStyle, "data-availability": disabled ? "disabled" : readOnly ? "readOnly" : "enabled", "data-size": size, "data-state": state, "data-invalid": hasInvalidState || undefined, "data-value": currentValue === null ? "empty" : "filled", children: [_jsxs("label", { className: "hjm-field__label", htmlFor: controlId, children: [label, required ? _jsx("span", { "aria-hidden": "true", children: " *" }) : null] }), _jsxs("div", { className: "hjm-field__control hjm-number-field__control", children: [_jsx("button", { type: "button", "aria-controls": controlId, "aria-label": decrementLabel, className: "hjm-number-field__stepper", "data-direction": "decrement", disabled: unavailable || stepper.decrementDisabled, onClick: () => stepValue("decrement"), onMouseDown: (event) => event.preventDefault(), tabIndex: -1, children: _jsx("span", { "aria-hidden": "true", children: "\u2212" }) }), _jsx("input", { ...inputProps, ref: composeRefs(inputRef, forwardedRef), id: controlId, type: "text", role: "spinbutton", className: classNames("hjm-field__input", "hjm-number-field__input", inputClassName), value: draft, inputMode: inputMode ?? defaultInputMode(min, descriptor.step), required: required, disabled: disabled, readOnly: readOnly, "aria-invalid": error ? true : ariaInvalid, "aria-describedby": describedBy, ...(error ? { "aria-errormessage": errorId } : {}), "aria-valuemin": min, "aria-valuemax": max, ...(announcedValue === null ? {} : { "aria-valuenow": announcedValue }), ...(valueText === undefined ? {} : { "aria-valuetext": valueText }), onChange: (event) => setDraft(event.currentTarget.value), onFocus: handleFocus, onBlur: handleBlur, onKeyDown: handleKeyDown }), _jsx("button", { type: "button", "aria-controls": controlId, "aria-label": incrementLabel, className: "hjm-number-field__stepper", "data-direction": "increment", disabled: unavailable || stepper.incrementDisabled, onClick: () => stepValue("increment"), onMouseDown: (event) => event.preventDefault(), tabIndex: -1, children: _jsx("span", { "aria-hidden": "true", children: "+" }) })] }), description && !error ? (_jsx("div", { id: descriptionId, className: "hjm-field__description", children: description })) : null, _jsx(FieldError, { id: errorId, error: error })] }));
114
115
  });
115
116
  //# sourceMappingURL=number-field.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"number-field.js","sourceRoot":"","sources":["../src/number-field.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n commitNumberFieldInput,\n numberFieldRecipe,\n parseNumberFieldInput,\n resolveNumberFieldDescriptor,\n resolveNumberFieldInputStepperState,\n stepNumberFieldInput,\n type NumberFieldSize,\n type NumberFieldValue,\n} from \"@hjmds/design-contracts/components/number-field\";\nimport {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\n\nimport { classNames, composeRefs, useControllableState } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { FieldError } from \"./internal/field-error.js\";\n\ntype NativeNumberInputProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n | \"aria-errormessage\"\n | \"aria-valuemax\"\n | \"aria-valuemin\"\n | \"aria-valuenow\"\n | \"aria-valuetext\"\n | \"children\"\n | \"className\"\n | \"defaultValue\"\n | \"disabled\"\n | \"max\"\n | \"min\"\n | \"onChange\"\n | \"readOnly\"\n | \"required\"\n | \"role\"\n | \"size\"\n | \"step\"\n | \"type\"\n | \"value\"\n>;\n\nexport type NumberFieldProps = NativeNumberInputProps &\n Readonly<{\n label: ReactNode;\n min: number;\n max: number;\n step?: number;\n value?: NumberFieldValue;\n defaultValue?: NumberFieldValue;\n onValueChange?: (value: NumberFieldValue) => void;\n description?: ReactNode;\n error?: ReactNode;\n required?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n size?: NumberFieldSize;\n /** Product-localized accessible name for the decrement action. */\n decrementLabel: string;\n /** Product-localized accessible name for the increment action. */\n incrementLabel: string;\n /** Optional product formatting for assistive output, never the editable text. */\n getValueText?: (value: number) => string;\n className?: string;\n inputClassName?: string;\n /**\n * Canonical layout-only placement on the field frame. `style` keeps going to\n * the input element, where it always went, so existing callers do not move.\n */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nfunction valueToInput(value: NumberFieldValue): string {\n return value === null ? \"\" : String(value);\n}\n\nfunction defaultInputMode(min: number, step: number): \"decimal\" | \"numeric\" | \"text\" {\n if (min < 0) return \"text\";\n return Number.isInteger(step) ? \"numeric\" : \"decimal\";\n}\n\n/**\n * Exact numeric entry with a nullable draft and explicit single-step actions.\n * Typing commits on blur; steppers and ArrowUp/ArrowDown commit immediately.\n */\nexport const NumberField = forwardRef<HTMLInputElement, NumberFieldProps>(\n function NumberField(\n {\n id,\n label,\n min,\n max,\n step,\n value,\n defaultValue = null,\n onValueChange,\n description,\n error,\n required = false,\n disabled = false,\n readOnly = false,\n size = \"medium\",\n decrementLabel,\n incrementLabel,\n getValueText,\n className,\n inputClassName,\n layoutStyle,\n inputMode,\n onBlur,\n onFocus,\n onKeyDown,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n ...inputProps\n },\n forwardedRef,\n ) {\n const generatedId = useId();\n const controlId = id ?? `hjm-number-${generatedId.replaceAll(\":\", \"\")}`;\n const descriptionId = `${controlId}-description`;\n const errorId = `${controlId}-error`;\n const inputRef = useRef<HTMLInputElement>(null);\n const controlled = value !== undefined;\n const controlledAtMount = useRef(controlled);\n if (controlledAtMount.current !== controlled) {\n throw new Error(\"HJM components cannot switch between controlled and uncontrolled state\");\n }\n const [currentValue, setCurrentValue] = useControllableState<NumberFieldValue>({\n ...(controlled ? { value } : {}),\n defaultValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const descriptor = resolveNumberFieldDescriptor({\n value: currentValue,\n min,\n max,\n ...(step === undefined ? {} : { step }),\n });\n const [draft, setDraft] = useState(() => valueToInput(currentValue));\n const [focused, setFocused] = useState(false);\n const stepper = resolveNumberFieldInputStepperState(draft, descriptor);\n\n useEffect(() => {\n setDraft(valueToInput(currentValue));\n }, [currentValue]);\n\n const restoreOrDisplay = (next: NumberFieldValue) => {\n setDraft(valueToInput(controlled ? currentValue : next));\n };\n\n const commitDraft = () => {\n if (disabled || readOnly) return;\n const next = commitNumberFieldInput(draft, descriptor);\n if (next === undefined) {\n setDraft(valueToInput(currentValue));\n return;\n }\n if (!Object.is(next, currentValue)) setCurrentValue(next);\n restoreOrDisplay(next);\n };\n\n const stepValue = (direction: \"increment\" | \"decrement\") => {\n if (disabled || readOnly) return;\n const next = stepNumberFieldInput(draft, descriptor, direction);\n if (!Object.is(next, currentValue)) setCurrentValue(next);\n restoreOrDisplay(next);\n inputRef.current?.focus({ preventScroll: true });\n };\n\n const handleFocus = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(event);\n };\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n commitDraft();\n onBlur?.(event);\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || disabled || readOnly || event.nativeEvent.isComposing || event.keyCode === 229) return;\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n stepValue(event.key === \"ArrowUp\" ? \"increment\" : \"decrement\");\n } else if (event.key === \"Enter\") {\n commitDraft();\n }\n };\n\n const unavailable = disabled || readOnly;\n const state = disabled\n ? \"disabled\"\n : error || ariaInvalid\n ? \"invalid\"\n : focused\n ? \"focused\"\n : \"idle\";\n const describedBy = [\n ariaDescribedBy,\n error ? errorId : description ? descriptionId : undefined,\n ].filter(Boolean).join(\" \") || undefined;\n const parsedDraft = parseNumberFieldInput(draft);\n const announcedValue =\n typeof parsedDraft === \"number\" && parsedDraft >= min && parsedDraft <= max\n ? parsedDraft\n : currentValue;\n const valueText = announcedValue === null ? undefined : getValueText?.(announcedValue);\n\n return (\n <div\n className={classNames(\"hjm-field\", \"hjm-number-field\", className)}\n // fieldRecipe.disabledScope fades label and control; the amount is this component's\n // recipe (numberFieldRecipe.states), as on Native — the frame default is fieldRecipe's.\n style={disabled\n ? ({ ...layoutStyle, \"--hjm-field-disabled-opacity\": numberFieldRecipe.states.disabledOpacity } as CSSProperties)\n : layoutStyle}\n data-availability={disabled ? \"disabled\" : readOnly ? \"readOnly\" : \"enabled\"}\n data-size={size}\n data-state={state}\n data-value={currentValue === null ? \"empty\" : \"filled\"}\n >\n <label className=\"hjm-field__label\" htmlFor={controlId}>\n {label}\n {required ? <span aria-hidden=\"true\"> *</span> : null}\n </label>\n <div className=\"hjm-field__control hjm-number-field__control\">\n <button\n type=\"button\"\n aria-controls={controlId}\n aria-label={decrementLabel}\n className=\"hjm-number-field__stepper\"\n data-direction=\"decrement\"\n disabled={unavailable || stepper.decrementDisabled}\n onClick={() => stepValue(\"decrement\")}\n onMouseDown={(event) => event.preventDefault()}\n tabIndex={-1}\n >\n <span aria-hidden=\"true\">−</span>\n </button>\n <input\n {...inputProps}\n ref={composeRefs(inputRef, forwardedRef)}\n id={controlId}\n type=\"text\"\n role=\"spinbutton\"\n className={classNames(\n \"hjm-field__input\",\n \"hjm-number-field__input\",\n inputClassName,\n )}\n value={draft}\n inputMode={inputMode ?? defaultInputMode(min, descriptor.step)}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n aria-invalid={error ? true : ariaInvalid}\n aria-describedby={describedBy}\n {...(error ? { \"aria-errormessage\": errorId } : {})}\n aria-valuemin={min}\n aria-valuemax={max}\n {...(announcedValue === null ? {} : { \"aria-valuenow\": announcedValue })}\n {...(valueText === undefined ? {} : { \"aria-valuetext\": valueText })}\n onChange={(event) => setDraft(event.currentTarget.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n />\n <button\n type=\"button\"\n aria-controls={controlId}\n aria-label={incrementLabel}\n className=\"hjm-number-field__stepper\"\n data-direction=\"increment\"\n disabled={unavailable || stepper.incrementDisabled}\n onClick={() => stepValue(\"increment\")}\n onMouseDown={(event) => event.preventDefault()}\n tabIndex={-1}\n >\n <span aria-hidden=\"true\">+</span>\n </button>\n </div>\n {description && !error ? (\n <div id={descriptionId} className=\"hjm-field__description\">{description}</div>\n ) : null}\n <FieldError id={errorId} error={error} />\n </div>\n );\n },\n);\n"]}
1
+ {"version":3,"file":"number-field.js","sourceRoot":"","sources":["../src/number-field.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n commitNumberFieldInput,\n numberFieldRecipe,\n parseNumberFieldInput,\n resolveNumberFieldDescriptor,\n resolveNumberFieldInputStepperState,\n stepNumberFieldInput,\n type NumberFieldSize,\n type NumberFieldValue,\n} from \"@hjmds/design-contracts/components/number-field\";\nimport {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\n\nimport { classNames, composeRefs, isAriaInvalid, useControllableState } from \"./internal.js\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { FieldError } from \"./internal/field-error.js\";\n\ntype NativeNumberInputProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n | \"aria-errormessage\"\n | \"aria-valuemax\"\n | \"aria-valuemin\"\n | \"aria-valuenow\"\n | \"aria-valuetext\"\n | \"children\"\n | \"className\"\n | \"defaultValue\"\n | \"disabled\"\n | \"max\"\n | \"min\"\n | \"onChange\"\n | \"readOnly\"\n | \"required\"\n | \"role\"\n | \"size\"\n | \"step\"\n | \"type\"\n | \"value\"\n>;\n\nexport type NumberFieldProps = NativeNumberInputProps &\n Readonly<{\n label: ReactNode;\n min: number;\n max: number;\n step?: number;\n value?: NumberFieldValue;\n defaultValue?: NumberFieldValue;\n onValueChange?: (value: NumberFieldValue) => void;\n description?: ReactNode;\n error?: ReactNode;\n required?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n size?: NumberFieldSize;\n /** Product-localized accessible name for the decrement action. */\n decrementLabel: string;\n /** Product-localized accessible name for the increment action. */\n incrementLabel: string;\n /** Optional product formatting for assistive output, never the editable text. */\n getValueText?: (value: number) => string;\n className?: string;\n inputClassName?: string;\n /**\n * Canonical layout-only placement on the field frame. `style` keeps going to\n * the input element, where it always went, so existing callers do not move.\n */\n layoutStyle?: HjmCompositionStyleProp;\n }>;\n\nfunction valueToInput(value: NumberFieldValue): string {\n return value === null ? \"\" : String(value);\n}\n\nfunction defaultInputMode(min: number, step: number): \"decimal\" | \"numeric\" | \"text\" {\n if (min < 0) return \"text\";\n return Number.isInteger(step) ? \"numeric\" : \"decimal\";\n}\n\n/**\n * Exact numeric entry with a nullable draft and explicit single-step actions.\n * Typing commits on blur; steppers and ArrowUp/ArrowDown commit immediately.\n */\nexport const NumberField = forwardRef<HTMLInputElement, NumberFieldProps>(\n function NumberField(\n {\n id,\n label,\n min,\n max,\n step,\n value,\n defaultValue = null,\n onValueChange,\n description,\n error,\n required = false,\n disabled = false,\n readOnly = false,\n size = \"medium\",\n decrementLabel,\n incrementLabel,\n getValueText,\n className,\n inputClassName,\n layoutStyle,\n inputMode,\n onBlur,\n onFocus,\n onKeyDown,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n ...inputProps\n },\n forwardedRef,\n ) {\n const generatedId = useId();\n const controlId = id ?? `hjm-number-${generatedId.replaceAll(\":\", \"\")}`;\n const descriptionId = `${controlId}-description`;\n const errorId = `${controlId}-error`;\n const inputRef = useRef<HTMLInputElement>(null);\n const controlled = value !== undefined;\n const controlledAtMount = useRef(controlled);\n if (controlledAtMount.current !== controlled) {\n throw new Error(\"HJM components cannot switch between controlled and uncontrolled state\");\n }\n const [currentValue, setCurrentValue] = useControllableState<NumberFieldValue>({\n ...(controlled ? { value } : {}),\n defaultValue,\n ...(onValueChange === undefined ? {} : { onChange: onValueChange }),\n });\n const descriptor = resolveNumberFieldDescriptor({\n value: currentValue,\n min,\n max,\n ...(step === undefined ? {} : { step }),\n });\n const [draft, setDraft] = useState(() => valueToInput(currentValue));\n const [focused, setFocused] = useState(false);\n const stepper = resolveNumberFieldInputStepperState(draft, descriptor);\n\n useEffect(() => {\n setDraft(valueToInput(currentValue));\n }, [currentValue]);\n\n const restoreOrDisplay = (next: NumberFieldValue) => {\n setDraft(valueToInput(controlled ? currentValue : next));\n };\n\n const commitDraft = () => {\n if (disabled || readOnly) return;\n const next = commitNumberFieldInput(draft, descriptor);\n if (next === undefined) {\n setDraft(valueToInput(currentValue));\n return;\n }\n if (!Object.is(next, currentValue)) setCurrentValue(next);\n restoreOrDisplay(next);\n };\n\n const stepValue = (direction: \"increment\" | \"decrement\") => {\n if (disabled || readOnly) return;\n const next = stepNumberFieldInput(draft, descriptor, direction);\n if (!Object.is(next, currentValue)) setCurrentValue(next);\n restoreOrDisplay(next);\n inputRef.current?.focus({ preventScroll: true });\n };\n\n const handleFocus = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(event);\n };\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n commitDraft();\n onBlur?.(event);\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || disabled || readOnly || event.nativeEvent.isComposing || event.keyCode === 229) return;\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n stepValue(event.key === \"ArrowUp\" ? \"increment\" : \"decrement\");\n } else if (event.key === \"Enter\") {\n commitDraft();\n }\n };\n\n const unavailable = disabled || readOnly;\n const hasInvalidState = Boolean(error) || isAriaInvalid(ariaInvalid);\n const state = disabled\n ? \"disabled\"\n : hasInvalidState\n ? \"invalid\"\n : focused\n ? \"focused\"\n : \"idle\";\n const describedBy = [\n ariaDescribedBy,\n error ? errorId : description ? descriptionId : undefined,\n ].filter(Boolean).join(\" \") || undefined;\n const parsedDraft = parseNumberFieldInput(draft);\n const announcedValue =\n typeof parsedDraft === \"number\" && parsedDraft >= min && parsedDraft <= max\n ? parsedDraft\n : currentValue;\n const valueText = announcedValue === null ? undefined : getValueText?.(announcedValue);\n\n return (\n <div\n className={classNames(\"hjm-field\", \"hjm-number-field\", className)}\n // fieldRecipe.disabledScope fades label and control; the amount is this component's\n // recipe (numberFieldRecipe.states), as on Native — the frame default is fieldRecipe's.\n style={disabled\n ? ({ ...layoutStyle, \"--hjm-field-disabled-opacity\": numberFieldRecipe.states.disabledOpacity } as CSSProperties)\n : layoutStyle}\n data-availability={disabled ? \"disabled\" : readOnly ? \"readOnly\" : \"enabled\"}\n data-size={size}\n data-state={state}\n data-invalid={hasInvalidState || undefined}\n data-value={currentValue === null ? \"empty\" : \"filled\"}\n >\n <label className=\"hjm-field__label\" htmlFor={controlId}>\n {label}\n {required ? <span aria-hidden=\"true\"> *</span> : null}\n </label>\n <div className=\"hjm-field__control hjm-number-field__control\">\n <button\n type=\"button\"\n aria-controls={controlId}\n aria-label={decrementLabel}\n className=\"hjm-number-field__stepper\"\n data-direction=\"decrement\"\n disabled={unavailable || stepper.decrementDisabled}\n onClick={() => stepValue(\"decrement\")}\n onMouseDown={(event) => event.preventDefault()}\n tabIndex={-1}\n >\n <span aria-hidden=\"true\">−</span>\n </button>\n <input\n {...inputProps}\n ref={composeRefs(inputRef, forwardedRef)}\n id={controlId}\n type=\"text\"\n role=\"spinbutton\"\n className={classNames(\n \"hjm-field__input\",\n \"hjm-number-field__input\",\n inputClassName,\n )}\n value={draft}\n inputMode={inputMode ?? defaultInputMode(min, descriptor.step)}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n aria-invalid={error ? true : ariaInvalid}\n aria-describedby={describedBy}\n {...(error ? { \"aria-errormessage\": errorId } : {})}\n aria-valuemin={min}\n aria-valuemax={max}\n {...(announcedValue === null ? {} : { \"aria-valuenow\": announcedValue })}\n {...(valueText === undefined ? {} : { \"aria-valuetext\": valueText })}\n onChange={(event) => setDraft(event.currentTarget.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n />\n <button\n type=\"button\"\n aria-controls={controlId}\n aria-label={incrementLabel}\n className=\"hjm-number-field__stepper\"\n data-direction=\"increment\"\n disabled={unavailable || stepper.incrementDisabled}\n onClick={() => stepValue(\"increment\")}\n onMouseDown={(event) => event.preventDefault()}\n tabIndex={-1}\n >\n <span aria-hidden=\"true\">+</span>\n </button>\n </div>\n {description && !error ? (\n <div id={descriptionId} className=\"hjm-field__description\">{description}</div>\n ) : null}\n <FieldError id={errorId} error={error} />\n </div>\n );\n },\n);\n"]}
@@ -63,6 +63,8 @@ export type AlertDialogProps = ModalOpenState<Readonly<{
63
63
  reason: AlertDialogOpenChangeReason;
64
64
  }>> & Readonly<{
65
65
  request: AlertDialogRequest;
66
+ /** Product eligibility (for example a retry cooldown); cancel remains available. */
67
+ confirmDisabled?: boolean;
66
68
  icon?: ReactNode;
67
69
  size?: DialogSize;
68
70
  returnFocusRef?: React.RefObject<HTMLElement | null>;
@@ -102,6 +104,8 @@ export type SheetProps = ModalOpenState<SheetOpenChangeDetails> & Readonly<{
102
104
  }>;
103
105
  busy?: boolean;
104
106
  dismissPolicy?: Partial<SheetDismissPolicy>;
107
+ /** Downward handle dismissal. Bottom sheets enable it by default; side sheets opt in for a reading panel. */
108
+ swipeDirection?: "down";
105
109
  /** Localized accessible name for the close action. */
106
110
  closeLabel: string;
107
111
  /** Side sheets only. Bottom sheets focus their modal container, never an input on opening. */
@@ -1 +1 @@
1
- {"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../src/overlays.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../src/overlays.tsx"],"names":[],"mappings":"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"}
package/dist/overlays.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { InitialFocusProvider, useInitialFocusScope } from "./internal/initial-focus.js";
3
+ import { ScreenFooterContext } from "./internal/screen-footer.js";
3
4
  import { initialFocusDefaults } from "@hjmds/design-contracts/screen-patterns";
4
5
  import { useOverlayOriginMotion } from "./internal/overlay-origin-motion.js";
5
6
  import { layer } from "@hjmds/design-contracts/foundations";
@@ -99,7 +100,7 @@ export const Dialog = forwardRef(function Dialog({ trigger, title, description,
99
100
  }
100
101
  }, children: [_jsxs("div", { ref: mergedContentRef, id: contentId, role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": description ? descriptionId : undefined, "aria-busy": busy || undefined, inert: !open, "aria-hidden": !open || undefined, tabIndex: -1, className: classNames("hjm-dialog", className), "data-hjm-modal-content": "", "data-size": size, "data-state": busy ? "busy" : "idle", "data-scroll": scrollEnabled ? undefined : "locked", children: [_jsxs("header", { className: "hjm-dialog__header", children: [_jsx("h2", { id: titleId, className: "hjm-dialog__title", children: title }), dismissible ? (_jsx("button", { type: "button", className: "hjm-dialog__close", "aria-label": closeLabel, disabled: busy, onClick: () => requestClose("close-action"), children: "\u00D7" })) : null] }), description ? _jsx("p", { id: descriptionId, className: "hjm-dialog__description", children: description }) : null, children ? _jsx("div", { className: "hjm-dialog__body", children: _jsx(InitialFocusProvider, { scope: focusScope, children: children }) }) : null, footer ? _jsx("footer", { className: "hjm-dialog__footer", children: footer }) : null] }), overlayLayer ? _jsx("div", { className: "hjm-dialog__overlay-layer", "aria-hidden": "true", inert: true, children: overlayLayer }) : null] }) })) : null] }));
101
102
  });
102
- export const AlertDialog = forwardRef(function AlertDialog({ trigger, request, icon, size = dialogRecipe.defaults.size, returnFocusRef, modalPriority = 0, portalContainer, open: openProp, defaultOpen, onOpenChange, className, }, forwardedRef) {
103
+ export const AlertDialog = forwardRef(function AlertDialog({ trigger, request, confirmDisabled = false, icon, size = dialogRecipe.defaults.size, returnFocusRef, modalPriority = 0, portalContainer, open: openProp, defaultOpen, onOpenChange, className, }, forwardedRef) {
103
104
  const modalLayer = getModalLayer(modalPriority);
104
105
  validateAlertDialogRequest(request);
105
106
  const [open, changeOpen] = useOpenState({
@@ -153,7 +154,7 @@ export const AlertDialog = forwardRef(function AlertDialog({ trigger, request, i
153
154
  });
154
155
  const confirm = async () => {
155
156
  const session = sessionRef.current;
156
- if (!session)
157
+ if (!session || confirmDisabled)
157
158
  return;
158
159
  if (await session.confirm())
159
160
  changeOpen(false, { reason: "confirm" });
@@ -181,9 +182,9 @@ export const AlertDialog = forwardRef(function AlertDialog({ trigger, request, i
181
182
  return (_jsxs(_Fragment, { children: [trigger === undefined ? null : renderTrigger(trigger, triggerRef, open, contentId, "dialog", () => {
182
183
  startSession();
183
184
  changeOpen(true, { reason: "trigger" });
184
- }), open ? (_jsx(HjmPortal, { ...(portalContainer === undefined ? {} : { container: portalContainer }), children: _jsx("div", { className: "hjm-overlay", "data-kind": "alert-dialog", "data-modal-priority": modalPriority, "data-state": "open", style: { zIndex: modalLayer }, children: _jsxs("div", { ref: composeRefs(contentRef, forwardedRef), id: contentId, role: "alertdialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": `${descriptionId}${error ? ` ${errorId}` : ""}`, "aria-busy": busy || undefined, tabIndex: -1, className: classNames("hjm-alert-dialog", className), "data-hjm-modal-content": "", "data-size": size, "data-tone": tone, "data-state": busy ? "busy" : error ? "error" : "idle", children: [icon ? _jsx("div", { className: "hjm-alert-dialog__icon", "aria-hidden": "true", children: icon }) : null, _jsx("h2", { id: titleId, className: "hjm-alert-dialog__title", children: request.title }), _jsx("p", { id: descriptionId, className: "hjm-alert-dialog__description", children: request.description }), error ? _jsx("p", { id: errorId, className: "hjm-alert-dialog__error", role: "alert", children: error }) : null, _jsxs("div", { className: "hjm-alert-dialog__actions", children: [request.mode === "confirm" ? (_jsx(Button, { ref: cancelRef, tone: "secondary", disabled: busy || closing, onClick: () => cancel("cancel-action"), children: request.cancelLabel })) : null, _jsx(Button, { ref: confirmRef, tone: tone === "danger" ? "danger" : "primary", loading: busy, disabled: closing, onClick: () => void confirm(), children: request.confirmLabel })] })] }) }) })) : null] }));
185
+ }), open ? (_jsx(HjmPortal, { ...(portalContainer === undefined ? {} : { container: portalContainer }), children: _jsx("div", { className: "hjm-overlay", "data-kind": "alert-dialog", "data-modal-priority": modalPriority, "data-state": "open", style: { zIndex: modalLayer }, children: _jsxs("div", { ref: composeRefs(contentRef, forwardedRef), id: contentId, role: "alertdialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": `${descriptionId}${error ? ` ${errorId}` : ""}`, "aria-busy": busy || undefined, tabIndex: -1, className: classNames("hjm-alert-dialog", className), "data-hjm-modal-content": "", "data-size": size, "data-tone": tone, "data-state": busy ? "busy" : error ? "error" : "idle", children: [icon ? _jsx("div", { className: "hjm-alert-dialog__icon", "aria-hidden": "true", children: icon }) : null, _jsx("h2", { id: titleId, className: "hjm-alert-dialog__title", children: request.title }), _jsx("p", { id: descriptionId, className: "hjm-alert-dialog__description", children: request.description }), error ? _jsx("p", { id: errorId, className: "hjm-alert-dialog__error", role: "alert", children: error }) : null, _jsxs("div", { className: "hjm-alert-dialog__actions", children: [request.mode === "confirm" ? (_jsx(Button, { ref: cancelRef, tone: "secondary", disabled: busy || closing, onClick: () => cancel("cancel-action"), children: request.cancelLabel })) : null, _jsx(Button, { ref: confirmRef, tone: tone === "danger" ? "danger" : "primary", loading: busy, disabled: closing || confirmDisabled, onClick: () => void confirm(), children: request.confirmLabel })] })] }) }) })) : null] }));
185
186
  });
186
- export const Sheet = forwardRef(function Sheet({ trigger, title, description, children, footer, placement = sheetRecipe.defaults.placement, size = sheetRecipe.defaults.size, detents, activeDetent, onDetentChange, detentLabels, busy = false, dismissPolicy, closeLabel, initialFocusRef, initialFocus = initialFocusDefaults.overlay, returnFocusRef, onDismissComplete, modalPriority = 0, portalContainer, open: openProp, defaultOpen, onOpenChange, className, showClose, }, forwardedRef) {
187
+ export const Sheet = forwardRef(function Sheet({ trigger, title, description, children, footer, placement = sheetRecipe.defaults.placement, size = sheetRecipe.defaults.size, detents, activeDetent, onDetentChange, detentLabels, busy = false, dismissPolicy, swipeDirection, closeLabel, initialFocusRef, initialFocus = initialFocusDefaults.overlay, returnFocusRef, onDismissComplete, modalPriority = 0, portalContainer, open: openProp, defaultOpen, onOpenChange, className, showClose, }, forwardedRef) {
187
188
  const modalLayer = getModalLayer(modalPriority);
188
189
  const [open, changeOpen] = useOpenState({
189
190
  ...(openProp === undefined ? {} : { open: openProp }),
@@ -194,11 +195,27 @@ export const Sheet = forwardRef(function Sheet({ trigger, title, description, ch
194
195
  const closeVisible = resolveSheetCloseButton(placement, showClose);
195
196
  // Drag-to-dismiss (2026-10-16 user decision): handle and header follow the pointer downward and a
196
197
  // release past the distance or velocity threshold closes with reason "swipe".
197
- const showHandle = placement === "bottom" && policy.dismissible && policy.swipeDismiss;
198
+ const showHandle = (placement === "bottom" || swipeDirection === "down") && policy.dismissible && policy.swipeDismiss;
198
199
  const closeBlocked = busy && !policy.dismissWhileBusy;
199
200
  const canSwipe = showHandle && !closeBlocked;
200
201
  const dragRef = useRef(null);
201
202
  const [dragY, setDragY] = useState(0);
203
+ const suppressDragClick = useRef(false);
204
+ const cancelDrag = (pointerId) => {
205
+ if (dragRef.current?.pointerId !== pointerId)
206
+ return;
207
+ suppressDragClick.current = dragRef.current.moved;
208
+ dragRef.current = null;
209
+ setDragY(0);
210
+ };
211
+ useEffect(() => {
212
+ // Retire a held gesture when its modal closes or becomes busy/non-dismissible.
213
+ if (open && canSwipe)
214
+ return;
215
+ dragRef.current = null;
216
+ suppressDragClick.current = false;
217
+ setDragY(0);
218
+ }, [open, canSwipe]);
202
219
  const lifecycleRef = useRef(createSheetLifecycle(open));
203
220
  const previousOpenRef = useRef(open);
204
221
  const currentOpenRef = useRef(open);
@@ -283,33 +300,44 @@ export const Sheet = forwardRef(function Sheet({ trigger, title, description, ch
283
300
  requestClose("outside");
284
301
  }
285
302
  }, children: _jsxs("div", { ref: composeRefs(contentRef, forwardedRef), id: contentId, role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": description ? descriptionId : undefined, "aria-busy": busy || undefined, tabIndex: -1, className: classNames("hjm-sheet", className), "data-hjm-modal-content": "", "data-placement": placement, "data-detent": activeDetent ?? (size === "auto" ? undefined : size), "data-has-footer": footer ? true : undefined, "data-state": busy ? "busy" : "idle", "data-dragging": dragY > 0 || undefined, style: dragY > 0 ? { transform: `translateY(${dragY}px)` } : undefined, children: [_jsx("h2", { id: titleId, className: "hjm-visually-hidden", children: title }), _jsxs("div", { className: "hjm-sheet__drag", "data-swipe": canSwipe || undefined, onPointerDown: (event) => {
286
- if (!canSwipe || event.button !== 0 || event.target.closest("a,input,textarea,select,.hjm-dialog__close"))
303
+ if (!canSwipe || dragRef.current || event.button !== 0 || event.target.closest("a,input,textarea,select,.hjm-dialog__close"))
287
304
  return;
288
- dragRef.current = { pointerId: event.pointerId, y: event.clientY, t: event.timeStamp, moved: false };
305
+ suppressDragClick.current = false;
306
+ dragRef.current = { pointerId: event.pointerId, x: event.clientX, y: event.clientY, t: event.timeStamp, moved: false };
307
+ // Capture from the start so a release outside cannot strand ownership. Preserve the
308
+ // originating handle button as the click target for tap/keyboard/detent behavior.
309
+ (event.target.closest("button") ?? event.currentTarget).setPointerCapture(event.pointerId);
289
310
  }, onPointerMove: (event) => {
290
311
  const drag = dragRef.current;
291
- if (!drag || drag.pointerId !== event.pointerId)
312
+ if (!canSwipe || !drag || drag.pointerId !== event.pointerId)
292
313
  return;
293
314
  const dy = event.clientY - drag.y;
294
- if (!drag.moved && dy < sheetDragRecipe.activationDistance)
315
+ if (!drag.moved && (dy < sheetDragRecipe.activationDistance || dy <= Math.abs(event.clientX - drag.x)))
295
316
  return;
296
- if (!drag.moved) {
297
- drag.moved = true;
298
- event.currentTarget.setPointerCapture(event.pointerId);
299
- }
317
+ drag.moved = true;
300
318
  setDragY(Math.max(0, dy));
301
319
  }, onPointerUp: (event) => {
302
320
  const drag = dragRef.current;
321
+ if (!drag || drag.pointerId !== event.pointerId)
322
+ return;
303
323
  dragRef.current = null;
304
- if (!drag || drag.pointerId !== event.pointerId || !drag.moved)
324
+ suppressDragClick.current = drag.moved;
325
+ setDragY(0);
326
+ if (!canSwipe || !drag.moved)
305
327
  return;
306
328
  const dy = event.clientY - drag.y;
307
329
  const velocity = dy / Math.max(1, event.timeStamp - drag.t);
308
330
  const height = contentRef.current?.getBoundingClientRect().height ?? 0;
309
- setDragY(0);
310
331
  if (dy > height * sheetDragRecipe.dismissDistanceRatio || velocity > sheetDragRecipe.dismissVelocity)
311
332
  requestClose("swipe");
312
- }, onPointerCancel: () => { dragRef.current = null; setDragY(0); }, children: [detents && detentLabels && activeDetent ? (_jsx("div", { className: "hjm-sheet__handle-row", children: _jsx("button", { type: "button", className: "hjm-sheet__handle", "aria-label": resolveNextSheetDetent(detents, activeDetent, "expand") === null
333
+ }, onPointerCancel: (event) => cancelDrag(event.pointerId), onLostPointerCapture: (event) => cancelDrag(event.pointerId), onClickCapture: (event) => {
334
+ // The browser emits click after a released drag; it must not turn a short drag into a close.
335
+ if (!suppressDragClick.current || event.detail === 0)
336
+ return;
337
+ suppressDragClick.current = false;
338
+ event.preventDefault();
339
+ event.stopPropagation();
340
+ }, children: [detents && detentLabels && activeDetent ? (_jsx("div", { className: "hjm-sheet__handle-row", children: _jsx("button", { type: "button", className: "hjm-sheet__handle", "aria-label": resolveNextSheetDetent(detents, activeDetent, "expand") === null
313
341
  ? detentLabels.collapse
314
342
  : detentLabels.expand, onClick: () => {
315
343
  const expand = resolveNextSheetDetent(detents, activeDetent, "expand");
@@ -317,8 +345,8 @@ export const Sheet = forwardRef(function Sheet({ trigger, title, description, ch
317
345
  if (next !== null)
318
346
  onDetentChange?.(next);
319
347
  }, children: _jsx("span", { "aria-hidden": "true", className: "hjm-sheet__handle-bar" }) }) })) : showHandle ? (
320
- // Without detents the handle is the visible close control for keyboard and switch users.
321
- _jsx("div", { className: "hjm-sheet__handle-row", children: _jsx("button", { type: "button", className: "hjm-sheet__handle", "aria-label": closeLabel, disabled: closeBlocked, onClick: () => requestClose("close-action"), children: _jsx("span", { "aria-hidden": "true", className: "hjm-sheet__handle-bar" }) }) })) : null, description || (policy.dismissible && closeVisible) ? _jsxs("header", { className: "hjm-sheet__header", children: [description ? _jsx("div", { children: _jsx("p", { id: descriptionId, className: "hjm-sheet__description", children: description }) }) : null, policy.dismissible && closeVisible ? (_jsx("button", { type: "button", className: "hjm-dialog__close", "aria-label": closeLabel, disabled: busy && !policy.dismissWhileBusy, onClick: () => requestClose("close-action"), children: "\u00D7" })) : null] }) : null] }), children ? _jsx("div", { className: "hjm-sheet__body", children: _jsx(InitialFocusProvider, { scope: focusScope, children: children }) }) : null, footer ? _jsx("footer", { className: "hjm-sheet__footer", children: _jsx(InitialFocusProvider, { scope: focusScope, children: footer }) }) : null] }) }) })) : null] }));
348
+ // Keep one close command: an explicit × owns it; otherwise the handle supports keyboard and switch users.
349
+ _jsx("div", { className: "hjm-sheet__handle-row", children: closeVisible ? (_jsx("div", { className: "hjm-sheet__handle", "aria-hidden": "true", children: _jsx("span", { className: "hjm-sheet__handle-bar" }) })) : (_jsx("button", { type: "button", className: "hjm-sheet__handle", "aria-label": closeLabel, disabled: closeBlocked, onClick: () => requestClose("close-action"), children: _jsx("span", { "aria-hidden": "true", className: "hjm-sheet__handle-bar" }) })) })) : null, description || (policy.dismissible && closeVisible) ? _jsxs("header", { className: "hjm-sheet__header", children: [description ? _jsx("div", { children: _jsx("p", { id: descriptionId, className: "hjm-sheet__description", children: description }) }) : null, policy.dismissible && closeVisible ? (_jsx("button", { type: "button", className: "hjm-dialog__close", "aria-label": closeLabel, disabled: busy && !policy.dismissWhileBusy, onClick: () => requestClose("close-action"), children: "\u00D7" })) : null] }) : null] }), children ? _jsx("div", { className: "hjm-sheet__body", children: _jsx(ScreenFooterContext.Provider, { value: null, children: _jsx(InitialFocusProvider, { scope: focusScope, children: children }) }) }) : null, footer ? _jsx("footer", { className: "hjm-sheet__footer", children: _jsx(ScreenFooterContext.Provider, { value: { bottomPadding: placement === "bottom" ? "calc(var(--hjm-space-sm) + env(safe-area-inset-bottom, 0px))" : "var(--hjm-space-sm)" }, children: _jsx(InitialFocusProvider, { scope: focusScope, children: footer }) }) }) : null] }) }) })) : null] }));
322
350
  });
323
351
  export const Tooltip = forwardRef(function Tooltip({ trigger, content, placement, align, pointerOpenDelayMs = tooltipBehaviorDefaults.pointerOpenDelayMs, focusOpenDelayMs = tooltipBehaviorDefaults.focusOpenDelayMs, portalContainer, open: openProp, defaultOpen, onOpenChange, className, layoutStyle, }, ref) {
324
352
  const descriptor = resolveTooltipDescriptor({