@samline/drawer 2.0.2 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -28749,6 +28749,7 @@ var VISUALLY_HIDDEN_STYLE = {
28749
28749
  whiteSpace: "nowrap",
28750
28750
  border: 0
28751
28751
  };
28752
+ var useSafeLayoutEffect = typeof window === "undefined" ? import_react10.default.useEffect : import_react10.default.useLayoutEffect;
28752
28753
  function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, internalOnReleaseChange) {
28753
28754
  const { id: _id, parentId: _parentId, onDragChange, onReleaseChange, ...drawerOptions } = options;
28754
28755
  const baseProps = {
@@ -28777,11 +28778,16 @@ function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, i
28777
28778
  fadeFromIndex: void 0
28778
28779
  };
28779
28780
  }
28780
- function VanillaNode({ value, dataAttribute }) {
28781
+ function VanillaNode({
28782
+ value,
28783
+ dataAttribute
28784
+ }) {
28781
28785
  const ref = import_react10.default.useRef(null);
28782
- import_react10.default.useEffect(() => {
28786
+ useSafeLayoutEffect(() => {
28783
28787
  const element = ref.current;
28784
- if (!element) return;
28788
+ if (!element) {
28789
+ return;
28790
+ }
28785
28791
  element.innerHTML = "";
28786
28792
  if (value instanceof HTMLElement) {
28787
28793
  element.appendChild(value);
@@ -28802,6 +28808,19 @@ function VanillaNode({ value, dataAttribute }) {
28802
28808
  }
28803
28809
  return /* @__PURE__ */ import_react10.default.createElement("div", { ...dataAttribute ? { [dataAttribute]: "" } : {}, ref });
28804
28810
  }
28811
+ function readAccessibleTextFromRoot(root, elementId) {
28812
+ if (!root || !elementId) {
28813
+ return void 0;
28814
+ }
28815
+ const elements = Array.from(root.querySelectorAll("[id]"));
28816
+ for (const element of elements) {
28817
+ if (element instanceof HTMLElement && element.id === elementId) {
28818
+ const value = element.textContent?.trim();
28819
+ return value ? value : void 0;
28820
+ }
28821
+ }
28822
+ return root.id === elementId ? root.textContent?.trim() || void 0 : void 0;
28823
+ }
28805
28824
  function VanillaDrawerRenderer({
28806
28825
  options,
28807
28826
  open,
@@ -28830,16 +28849,43 @@ function VanillaDrawerRenderer({
28830
28849
  const rootProps = toReactDrawerProps(drawerOptions, open, onOpenChange, onDragChange, onReleaseChange);
28831
28850
  const shouldRenderHandle = Boolean(drawerOptions.handleOnly || showHandle);
28832
28851
  const shouldRenderVanillaContent = title != null || description != null || content != null;
28852
+ const resolvedContent = import_react10.default.useMemo(() => {
28853
+ if (content instanceof HTMLElement) {
28854
+ return {
28855
+ value: content,
28856
+ proxyTitle: title == null ? readAccessibleTextFromRoot(content, ariaLabelledBy) : void 0,
28857
+ proxyDescription: description == null ? readAccessibleTextFromRoot(content, ariaDescribedBy) : void 0
28858
+ };
28859
+ }
28860
+ if (typeof content === "function") {
28861
+ const result = content();
28862
+ return {
28863
+ value: result,
28864
+ proxyTitle: title == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaLabelledBy) : void 0,
28865
+ proxyDescription: description == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaDescribedBy) : void 0
28866
+ };
28867
+ }
28868
+ return {
28869
+ value: content,
28870
+ proxyTitle: void 0,
28871
+ proxyDescription: void 0
28872
+ };
28873
+ }, [ariaDescribedBy, ariaLabelledBy, content, description, title]);
28874
+ const proxyTitle = resolvedContent.proxyTitle ?? (title == null ? ariaLabel : void 0);
28875
+ const proxyDescription = resolvedContent.proxyDescription;
28876
+ const contentAriaLabel = title == null && !proxyTitle ? ariaLabel : void 0;
28877
+ const contentAriaLabelledBy = title == null && !proxyTitle ? ariaLabelledBy : void 0;
28878
+ const contentAriaDescribedBy = description == null && !proxyDescription ? ariaDescribedBy : void 0;
28833
28879
  return /* @__PURE__ */ import_react10.default.createElement(Drawer.Root, { ...rootProps }, triggerText ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Trigger, { asChild: true }, /* @__PURE__ */ import_react10.default.createElement("button", { type: "button", "data-drawer-vanilla-trigger": "" }, triggerText)) : null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Portal, null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Overlay, { className: overlayClassName }), /* @__PURE__ */ import_react10.default.createElement(
28834
28880
  Drawer.Content,
28835
28881
  {
28836
28882
  className: contentClassName,
28837
- "aria-label": title == null ? ariaLabel : void 0,
28838
- "aria-labelledby": title == null ? ariaLabelledBy : void 0,
28839
- "aria-describedby": description == null ? ariaDescribedBy : void 0
28883
+ "aria-label": contentAriaLabel,
28884
+ "aria-labelledby": contentAriaLabelledBy,
28885
+ "aria-describedby": contentAriaDescribedBy
28840
28886
  },
28841
28887
  shouldRenderHandle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Handle, { className: handleClassName }) : null,
28842
- shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: content, dataAttribute: "data-drawer-vanilla-body" })) : null
28888
+ shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, proxyTitle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: VISUALLY_HIDDEN_STYLE }, proxyTitle) : null, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, proxyDescription ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: VISUALLY_HIDDEN_STYLE }, proxyDescription) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-body": "" }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: resolvedContent.value }))) : null
28843
28889
  )));
28844
28890
  }
28845
28891
 
@@ -28749,6 +28749,7 @@ For more information, see https://radix-ui.com/primitives/docs/components/${titl
28749
28749
  whiteSpace: "nowrap",
28750
28750
  border: 0
28751
28751
  };
28752
+ var useSafeLayoutEffect = typeof window === "undefined" ? import_react10.default.useEffect : import_react10.default.useLayoutEffect;
28752
28753
  function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, internalOnReleaseChange) {
28753
28754
  const { id: _id, parentId: _parentId, onDragChange, onReleaseChange, ...drawerOptions } = options;
28754
28755
  const baseProps = {
@@ -28777,11 +28778,16 @@ For more information, see https://radix-ui.com/primitives/docs/components/${titl
28777
28778
  fadeFromIndex: void 0
28778
28779
  };
28779
28780
  }
28780
- function VanillaNode({ value, dataAttribute }) {
28781
+ function VanillaNode({
28782
+ value,
28783
+ dataAttribute
28784
+ }) {
28781
28785
  const ref = import_react10.default.useRef(null);
28782
- import_react10.default.useEffect(() => {
28786
+ useSafeLayoutEffect(() => {
28783
28787
  const element = ref.current;
28784
- if (!element) return;
28788
+ if (!element) {
28789
+ return;
28790
+ }
28785
28791
  element.innerHTML = "";
28786
28792
  if (value instanceof HTMLElement) {
28787
28793
  element.appendChild(value);
@@ -28802,6 +28808,19 @@ For more information, see https://radix-ui.com/primitives/docs/components/${titl
28802
28808
  }
28803
28809
  return /* @__PURE__ */ import_react10.default.createElement("div", { ...dataAttribute ? { [dataAttribute]: "" } : {}, ref });
28804
28810
  }
28811
+ function readAccessibleTextFromRoot(root, elementId) {
28812
+ if (!root || !elementId) {
28813
+ return void 0;
28814
+ }
28815
+ const elements = Array.from(root.querySelectorAll("[id]"));
28816
+ for (const element of elements) {
28817
+ if (element instanceof HTMLElement && element.id === elementId) {
28818
+ const value = element.textContent?.trim();
28819
+ return value ? value : void 0;
28820
+ }
28821
+ }
28822
+ return root.id === elementId ? root.textContent?.trim() || void 0 : void 0;
28823
+ }
28805
28824
  function VanillaDrawerRenderer({
28806
28825
  options,
28807
28826
  open,
@@ -28830,16 +28849,43 @@ For more information, see https://radix-ui.com/primitives/docs/components/${titl
28830
28849
  const rootProps = toReactDrawerProps(drawerOptions, open, onOpenChange, onDragChange, onReleaseChange);
28831
28850
  const shouldRenderHandle = Boolean(drawerOptions.handleOnly || showHandle);
28832
28851
  const shouldRenderVanillaContent = title != null || description != null || content != null;
28852
+ const resolvedContent = import_react10.default.useMemo(() => {
28853
+ if (content instanceof HTMLElement) {
28854
+ return {
28855
+ value: content,
28856
+ proxyTitle: title == null ? readAccessibleTextFromRoot(content, ariaLabelledBy) : void 0,
28857
+ proxyDescription: description == null ? readAccessibleTextFromRoot(content, ariaDescribedBy) : void 0
28858
+ };
28859
+ }
28860
+ if (typeof content === "function") {
28861
+ const result = content();
28862
+ return {
28863
+ value: result,
28864
+ proxyTitle: title == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaLabelledBy) : void 0,
28865
+ proxyDescription: description == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaDescribedBy) : void 0
28866
+ };
28867
+ }
28868
+ return {
28869
+ value: content,
28870
+ proxyTitle: void 0,
28871
+ proxyDescription: void 0
28872
+ };
28873
+ }, [ariaDescribedBy, ariaLabelledBy, content, description, title]);
28874
+ const proxyTitle = resolvedContent.proxyTitle ?? (title == null ? ariaLabel : void 0);
28875
+ const proxyDescription = resolvedContent.proxyDescription;
28876
+ const contentAriaLabel = title == null && !proxyTitle ? ariaLabel : void 0;
28877
+ const contentAriaLabelledBy = title == null && !proxyTitle ? ariaLabelledBy : void 0;
28878
+ const contentAriaDescribedBy = description == null && !proxyDescription ? ariaDescribedBy : void 0;
28833
28879
  return /* @__PURE__ */ import_react10.default.createElement(Drawer.Root, { ...rootProps }, triggerText ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Trigger, { asChild: true }, /* @__PURE__ */ import_react10.default.createElement("button", { type: "button", "data-drawer-vanilla-trigger": "" }, triggerText)) : null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Portal, null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Overlay, { className: overlayClassName }), /* @__PURE__ */ import_react10.default.createElement(
28834
28880
  Drawer.Content,
28835
28881
  {
28836
28882
  className: contentClassName,
28837
- "aria-label": title == null ? ariaLabel : void 0,
28838
- "aria-labelledby": title == null ? ariaLabelledBy : void 0,
28839
- "aria-describedby": description == null ? ariaDescribedBy : void 0
28883
+ "aria-label": contentAriaLabel,
28884
+ "aria-labelledby": contentAriaLabelledBy,
28885
+ "aria-describedby": contentAriaDescribedBy
28840
28886
  },
28841
28887
  shouldRenderHandle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Handle, { className: handleClassName }) : null,
28842
- shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: content, dataAttribute: "data-drawer-vanilla-body" })) : null
28888
+ shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, proxyTitle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: VISUALLY_HIDDEN_STYLE }, proxyTitle) : null, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, proxyDescription ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: VISUALLY_HIDDEN_STYLE }, proxyDescription) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-body": "" }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: resolvedContent.value }))) : null
28843
28889
  )));
28844
28890
  }
28845
28891
 
@@ -28723,6 +28723,7 @@ var VISUALLY_HIDDEN_STYLE = {
28723
28723
  whiteSpace: "nowrap",
28724
28724
  border: 0
28725
28725
  };
28726
+ var useSafeLayoutEffect = typeof window === "undefined" ? import_react10.default.useEffect : import_react10.default.useLayoutEffect;
28726
28727
  function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, internalOnReleaseChange) {
28727
28728
  const { id: _id, parentId: _parentId, onDragChange, onReleaseChange, ...drawerOptions } = options;
28728
28729
  const baseProps = {
@@ -28751,11 +28752,16 @@ function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, i
28751
28752
  fadeFromIndex: void 0
28752
28753
  };
28753
28754
  }
28754
- function VanillaNode({ value, dataAttribute }) {
28755
+ function VanillaNode({
28756
+ value,
28757
+ dataAttribute
28758
+ }) {
28755
28759
  const ref = import_react10.default.useRef(null);
28756
- import_react10.default.useEffect(() => {
28760
+ useSafeLayoutEffect(() => {
28757
28761
  const element = ref.current;
28758
- if (!element) return;
28762
+ if (!element) {
28763
+ return;
28764
+ }
28759
28765
  element.innerHTML = "";
28760
28766
  if (value instanceof HTMLElement) {
28761
28767
  element.appendChild(value);
@@ -28776,6 +28782,19 @@ function VanillaNode({ value, dataAttribute }) {
28776
28782
  }
28777
28783
  return /* @__PURE__ */ import_react10.default.createElement("div", { ...dataAttribute ? { [dataAttribute]: "" } : {}, ref });
28778
28784
  }
28785
+ function readAccessibleTextFromRoot(root, elementId) {
28786
+ if (!root || !elementId) {
28787
+ return void 0;
28788
+ }
28789
+ const elements = Array.from(root.querySelectorAll("[id]"));
28790
+ for (const element of elements) {
28791
+ if (element instanceof HTMLElement && element.id === elementId) {
28792
+ const value = element.textContent?.trim();
28793
+ return value ? value : void 0;
28794
+ }
28795
+ }
28796
+ return root.id === elementId ? root.textContent?.trim() || void 0 : void 0;
28797
+ }
28779
28798
  function VanillaDrawerRenderer({
28780
28799
  options,
28781
28800
  open,
@@ -28804,16 +28823,43 @@ function VanillaDrawerRenderer({
28804
28823
  const rootProps = toReactDrawerProps(drawerOptions, open, onOpenChange, onDragChange, onReleaseChange);
28805
28824
  const shouldRenderHandle = Boolean(drawerOptions.handleOnly || showHandle);
28806
28825
  const shouldRenderVanillaContent = title != null || description != null || content != null;
28826
+ const resolvedContent = import_react10.default.useMemo(() => {
28827
+ if (content instanceof HTMLElement) {
28828
+ return {
28829
+ value: content,
28830
+ proxyTitle: title == null ? readAccessibleTextFromRoot(content, ariaLabelledBy) : void 0,
28831
+ proxyDescription: description == null ? readAccessibleTextFromRoot(content, ariaDescribedBy) : void 0
28832
+ };
28833
+ }
28834
+ if (typeof content === "function") {
28835
+ const result = content();
28836
+ return {
28837
+ value: result,
28838
+ proxyTitle: title == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaLabelledBy) : void 0,
28839
+ proxyDescription: description == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaDescribedBy) : void 0
28840
+ };
28841
+ }
28842
+ return {
28843
+ value: content,
28844
+ proxyTitle: void 0,
28845
+ proxyDescription: void 0
28846
+ };
28847
+ }, [ariaDescribedBy, ariaLabelledBy, content, description, title]);
28848
+ const proxyTitle = resolvedContent.proxyTitle ?? (title == null ? ariaLabel : void 0);
28849
+ const proxyDescription = resolvedContent.proxyDescription;
28850
+ const contentAriaLabel = title == null && !proxyTitle ? ariaLabel : void 0;
28851
+ const contentAriaLabelledBy = title == null && !proxyTitle ? ariaLabelledBy : void 0;
28852
+ const contentAriaDescribedBy = description == null && !proxyDescription ? ariaDescribedBy : void 0;
28807
28853
  return /* @__PURE__ */ import_react10.default.createElement(Drawer.Root, { ...rootProps }, triggerText ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Trigger, { asChild: true }, /* @__PURE__ */ import_react10.default.createElement("button", { type: "button", "data-drawer-vanilla-trigger": "" }, triggerText)) : null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Portal, null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Overlay, { className: overlayClassName }), /* @__PURE__ */ import_react10.default.createElement(
28808
28854
  Drawer.Content,
28809
28855
  {
28810
28856
  className: contentClassName,
28811
- "aria-label": title == null ? ariaLabel : void 0,
28812
- "aria-labelledby": title == null ? ariaLabelledBy : void 0,
28813
- "aria-describedby": description == null ? ariaDescribedBy : void 0
28857
+ "aria-label": contentAriaLabel,
28858
+ "aria-labelledby": contentAriaLabelledBy,
28859
+ "aria-describedby": contentAriaDescribedBy
28814
28860
  },
28815
28861
  shouldRenderHandle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Handle, { className: handleClassName }) : null,
28816
- shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: content, dataAttribute: "data-drawer-vanilla-body" })) : null
28862
+ shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, proxyTitle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: VISUALLY_HIDDEN_STYLE }, proxyTitle) : null, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, proxyDescription ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: VISUALLY_HIDDEN_STYLE }, proxyDescription) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-body": "" }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: resolvedContent.value }))) : null
28817
28863
  )));
28818
28864
  }
28819
28865
 
package/dist/index.js CHANGED
@@ -28748,6 +28748,7 @@ var VISUALLY_HIDDEN_STYLE = {
28748
28748
  whiteSpace: "nowrap",
28749
28749
  border: 0
28750
28750
  };
28751
+ var useSafeLayoutEffect = typeof window === "undefined" ? import_react10.default.useEffect : import_react10.default.useLayoutEffect;
28751
28752
  function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, internalOnReleaseChange) {
28752
28753
  const { id: _id, parentId: _parentId, onDragChange, onReleaseChange, ...drawerOptions } = options;
28753
28754
  const baseProps = {
@@ -28776,11 +28777,16 @@ function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, i
28776
28777
  fadeFromIndex: void 0
28777
28778
  };
28778
28779
  }
28779
- function VanillaNode({ value, dataAttribute }) {
28780
+ function VanillaNode({
28781
+ value,
28782
+ dataAttribute
28783
+ }) {
28780
28784
  const ref = import_react10.default.useRef(null);
28781
- import_react10.default.useEffect(() => {
28785
+ useSafeLayoutEffect(() => {
28782
28786
  const element = ref.current;
28783
- if (!element) return;
28787
+ if (!element) {
28788
+ return;
28789
+ }
28784
28790
  element.innerHTML = "";
28785
28791
  if (value instanceof HTMLElement) {
28786
28792
  element.appendChild(value);
@@ -28801,6 +28807,19 @@ function VanillaNode({ value, dataAttribute }) {
28801
28807
  }
28802
28808
  return /* @__PURE__ */ import_react10.default.createElement("div", { ...dataAttribute ? { [dataAttribute]: "" } : {}, ref });
28803
28809
  }
28810
+ function readAccessibleTextFromRoot(root, elementId) {
28811
+ if (!root || !elementId) {
28812
+ return void 0;
28813
+ }
28814
+ const elements = Array.from(root.querySelectorAll("[id]"));
28815
+ for (const element of elements) {
28816
+ if (element instanceof HTMLElement && element.id === elementId) {
28817
+ const value = element.textContent?.trim();
28818
+ return value ? value : void 0;
28819
+ }
28820
+ }
28821
+ return root.id === elementId ? root.textContent?.trim() || void 0 : void 0;
28822
+ }
28804
28823
  function VanillaDrawerRenderer({
28805
28824
  options,
28806
28825
  open,
@@ -28829,16 +28848,43 @@ function VanillaDrawerRenderer({
28829
28848
  const rootProps = toReactDrawerProps(drawerOptions, open, onOpenChange, onDragChange, onReleaseChange);
28830
28849
  const shouldRenderHandle = Boolean(drawerOptions.handleOnly || showHandle);
28831
28850
  const shouldRenderVanillaContent = title != null || description != null || content != null;
28851
+ const resolvedContent = import_react10.default.useMemo(() => {
28852
+ if (content instanceof HTMLElement) {
28853
+ return {
28854
+ value: content,
28855
+ proxyTitle: title == null ? readAccessibleTextFromRoot(content, ariaLabelledBy) : void 0,
28856
+ proxyDescription: description == null ? readAccessibleTextFromRoot(content, ariaDescribedBy) : void 0
28857
+ };
28858
+ }
28859
+ if (typeof content === "function") {
28860
+ const result = content();
28861
+ return {
28862
+ value: result,
28863
+ proxyTitle: title == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaLabelledBy) : void 0,
28864
+ proxyDescription: description == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaDescribedBy) : void 0
28865
+ };
28866
+ }
28867
+ return {
28868
+ value: content,
28869
+ proxyTitle: void 0,
28870
+ proxyDescription: void 0
28871
+ };
28872
+ }, [ariaDescribedBy, ariaLabelledBy, content, description, title]);
28873
+ const proxyTitle = resolvedContent.proxyTitle ?? (title == null ? ariaLabel : void 0);
28874
+ const proxyDescription = resolvedContent.proxyDescription;
28875
+ const contentAriaLabel = title == null && !proxyTitle ? ariaLabel : void 0;
28876
+ const contentAriaLabelledBy = title == null && !proxyTitle ? ariaLabelledBy : void 0;
28877
+ const contentAriaDescribedBy = description == null && !proxyDescription ? ariaDescribedBy : void 0;
28832
28878
  return /* @__PURE__ */ import_react10.default.createElement(Drawer.Root, { ...rootProps }, triggerText ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Trigger, { asChild: true }, /* @__PURE__ */ import_react10.default.createElement("button", { type: "button", "data-drawer-vanilla-trigger": "" }, triggerText)) : null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Portal, null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Overlay, { className: overlayClassName }), /* @__PURE__ */ import_react10.default.createElement(
28833
28879
  Drawer.Content,
28834
28880
  {
28835
28881
  className: contentClassName,
28836
- "aria-label": title == null ? ariaLabel : void 0,
28837
- "aria-labelledby": title == null ? ariaLabelledBy : void 0,
28838
- "aria-describedby": description == null ? ariaDescribedBy : void 0
28882
+ "aria-label": contentAriaLabel,
28883
+ "aria-labelledby": contentAriaLabelledBy,
28884
+ "aria-describedby": contentAriaDescribedBy
28839
28885
  },
28840
28886
  shouldRenderHandle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Handle, { className: handleClassName }) : null,
28841
- shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: content, dataAttribute: "data-drawer-vanilla-body" })) : null
28887
+ shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, proxyTitle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: VISUALLY_HIDDEN_STYLE }, proxyTitle) : null, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, proxyDescription ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: VISUALLY_HIDDEN_STYLE }, proxyDescription) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-body": "" }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: resolvedContent.value }))) : null
28842
28888
  )));
28843
28889
  }
28844
28890
 
package/dist/index.mjs CHANGED
@@ -28723,6 +28723,7 @@ var VISUALLY_HIDDEN_STYLE = {
28723
28723
  whiteSpace: "nowrap",
28724
28724
  border: 0
28725
28725
  };
28726
+ var useSafeLayoutEffect = typeof window === "undefined" ? import_react10.default.useEffect : import_react10.default.useLayoutEffect;
28726
28727
  function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, internalOnReleaseChange) {
28727
28728
  const { id: _id, parentId: _parentId, onDragChange, onReleaseChange, ...drawerOptions } = options;
28728
28729
  const baseProps = {
@@ -28751,11 +28752,16 @@ function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, i
28751
28752
  fadeFromIndex: void 0
28752
28753
  };
28753
28754
  }
28754
- function VanillaNode({ value, dataAttribute }) {
28755
+ function VanillaNode({
28756
+ value,
28757
+ dataAttribute
28758
+ }) {
28755
28759
  const ref = import_react10.default.useRef(null);
28756
- import_react10.default.useEffect(() => {
28760
+ useSafeLayoutEffect(() => {
28757
28761
  const element = ref.current;
28758
- if (!element) return;
28762
+ if (!element) {
28763
+ return;
28764
+ }
28759
28765
  element.innerHTML = "";
28760
28766
  if (value instanceof HTMLElement) {
28761
28767
  element.appendChild(value);
@@ -28776,6 +28782,19 @@ function VanillaNode({ value, dataAttribute }) {
28776
28782
  }
28777
28783
  return /* @__PURE__ */ import_react10.default.createElement("div", { ...dataAttribute ? { [dataAttribute]: "" } : {}, ref });
28778
28784
  }
28785
+ function readAccessibleTextFromRoot(root, elementId) {
28786
+ if (!root || !elementId) {
28787
+ return void 0;
28788
+ }
28789
+ const elements = Array.from(root.querySelectorAll("[id]"));
28790
+ for (const element of elements) {
28791
+ if (element instanceof HTMLElement && element.id === elementId) {
28792
+ const value = element.textContent?.trim();
28793
+ return value ? value : void 0;
28794
+ }
28795
+ }
28796
+ return root.id === elementId ? root.textContent?.trim() || void 0 : void 0;
28797
+ }
28779
28798
  function VanillaDrawerRenderer({
28780
28799
  options,
28781
28800
  open,
@@ -28804,16 +28823,43 @@ function VanillaDrawerRenderer({
28804
28823
  const rootProps = toReactDrawerProps(drawerOptions, open, onOpenChange, onDragChange, onReleaseChange);
28805
28824
  const shouldRenderHandle = Boolean(drawerOptions.handleOnly || showHandle);
28806
28825
  const shouldRenderVanillaContent = title != null || description != null || content != null;
28826
+ const resolvedContent = import_react10.default.useMemo(() => {
28827
+ if (content instanceof HTMLElement) {
28828
+ return {
28829
+ value: content,
28830
+ proxyTitle: title == null ? readAccessibleTextFromRoot(content, ariaLabelledBy) : void 0,
28831
+ proxyDescription: description == null ? readAccessibleTextFromRoot(content, ariaDescribedBy) : void 0
28832
+ };
28833
+ }
28834
+ if (typeof content === "function") {
28835
+ const result = content();
28836
+ return {
28837
+ value: result,
28838
+ proxyTitle: title == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaLabelledBy) : void 0,
28839
+ proxyDescription: description == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaDescribedBy) : void 0
28840
+ };
28841
+ }
28842
+ return {
28843
+ value: content,
28844
+ proxyTitle: void 0,
28845
+ proxyDescription: void 0
28846
+ };
28847
+ }, [ariaDescribedBy, ariaLabelledBy, content, description, title]);
28848
+ const proxyTitle = resolvedContent.proxyTitle ?? (title == null ? ariaLabel : void 0);
28849
+ const proxyDescription = resolvedContent.proxyDescription;
28850
+ const contentAriaLabel = title == null && !proxyTitle ? ariaLabel : void 0;
28851
+ const contentAriaLabelledBy = title == null && !proxyTitle ? ariaLabelledBy : void 0;
28852
+ const contentAriaDescribedBy = description == null && !proxyDescription ? ariaDescribedBy : void 0;
28807
28853
  return /* @__PURE__ */ import_react10.default.createElement(Drawer.Root, { ...rootProps }, triggerText ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Trigger, { asChild: true }, /* @__PURE__ */ import_react10.default.createElement("button", { type: "button", "data-drawer-vanilla-trigger": "" }, triggerText)) : null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Portal, null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Overlay, { className: overlayClassName }), /* @__PURE__ */ import_react10.default.createElement(
28808
28854
  Drawer.Content,
28809
28855
  {
28810
28856
  className: contentClassName,
28811
- "aria-label": title == null ? ariaLabel : void 0,
28812
- "aria-labelledby": title == null ? ariaLabelledBy : void 0,
28813
- "aria-describedby": description == null ? ariaDescribedBy : void 0
28857
+ "aria-label": contentAriaLabel,
28858
+ "aria-labelledby": contentAriaLabelledBy,
28859
+ "aria-describedby": contentAriaDescribedBy
28814
28860
  },
28815
28861
  shouldRenderHandle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Handle, { className: handleClassName }) : null,
28816
- shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: content, dataAttribute: "data-drawer-vanilla-body" })) : null
28862
+ shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, proxyTitle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: VISUALLY_HIDDEN_STYLE }, proxyTitle) : null, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, proxyDescription ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: VISUALLY_HIDDEN_STYLE }, proxyDescription) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-body": "" }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: resolvedContent.value }))) : null
28817
28863
  )));
28818
28864
  }
28819
28865
 
@@ -2220,6 +2220,7 @@ const VISUALLY_HIDDEN_STYLE = {
2220
2220
  whiteSpace: 'nowrap',
2221
2221
  border: 0
2222
2222
  };
2223
+ const useSafeLayoutEffect = typeof window === 'undefined' ? React__namespace.default.useEffect : React__namespace.default.useLayoutEffect;
2223
2224
  function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, internalOnReleaseChange) {
2224
2225
  const { id: _id, parentId: _parentId, onDragChange, onReleaseChange, ...drawerOptions } = options;
2225
2226
  const baseProps = {
@@ -2251,9 +2252,11 @@ function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, i
2251
2252
  }
2252
2253
  function VanillaNode({ value, dataAttribute }) {
2253
2254
  const ref = React__namespace.default.useRef(null);
2254
- React__namespace.default.useEffect(()=>{
2255
+ useSafeLayoutEffect(()=>{
2255
2256
  const element = ref.current;
2256
- if (!element) return;
2257
+ if (!element) {
2258
+ return;
2259
+ }
2257
2260
  element.innerHTML = '';
2258
2261
  if (value instanceof HTMLElement) {
2259
2262
  element.appendChild(value);
@@ -2281,11 +2284,60 @@ function VanillaNode({ value, dataAttribute }) {
2281
2284
  ref: ref
2282
2285
  });
2283
2286
  }
2287
+ function readAccessibleTextFromRoot(root, elementId) {
2288
+ var _root_textContent;
2289
+ if (!root || !elementId) {
2290
+ return undefined;
2291
+ }
2292
+ const elements = Array.from(root.querySelectorAll('[id]'));
2293
+ for (const element of elements){
2294
+ if (element instanceof HTMLElement && element.id === elementId) {
2295
+ var _element_textContent;
2296
+ const value = (_element_textContent = element.textContent) == null ? void 0 : _element_textContent.trim();
2297
+ return value ? value : undefined;
2298
+ }
2299
+ }
2300
+ return root.id === elementId ? ((_root_textContent = root.textContent) == null ? void 0 : _root_textContent.trim()) || undefined : undefined;
2301
+ }
2284
2302
  function VanillaDrawerRenderer({ options, open, onOpenChange, onDragChange, onReleaseChange }) {
2303
+ var _resolvedContent_proxyTitle;
2285
2304
  const { mountElement: _mountElement, triggerElement: _triggerElement, triggerText, showHandle, handleClassName, ariaLabel, ariaLabelledBy, ariaDescribedBy, title, titleVisuallyHidden, description, descriptionVisuallyHidden, content, overlayClassName, contentClassName, ...drawerOptions } = options;
2286
2305
  const rootProps = toReactDrawerProps(drawerOptions, open, onOpenChange, onDragChange, onReleaseChange);
2287
2306
  const shouldRenderHandle = Boolean(drawerOptions.handleOnly || showHandle);
2288
2307
  const shouldRenderVanillaContent = title != null || description != null || content != null;
2308
+ const resolvedContent = React__namespace.default.useMemo(()=>{
2309
+ if (content instanceof HTMLElement) {
2310
+ return {
2311
+ value: content,
2312
+ proxyTitle: title == null ? readAccessibleTextFromRoot(content, ariaLabelledBy) : undefined,
2313
+ proxyDescription: description == null ? readAccessibleTextFromRoot(content, ariaDescribedBy) : undefined
2314
+ };
2315
+ }
2316
+ if (typeof content === 'function') {
2317
+ const result = content();
2318
+ return {
2319
+ value: result,
2320
+ proxyTitle: title == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaLabelledBy) : undefined,
2321
+ proxyDescription: description == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaDescribedBy) : undefined
2322
+ };
2323
+ }
2324
+ return {
2325
+ value: content,
2326
+ proxyTitle: undefined,
2327
+ proxyDescription: undefined
2328
+ };
2329
+ }, [
2330
+ ariaDescribedBy,
2331
+ ariaLabelledBy,
2332
+ content,
2333
+ description,
2334
+ title
2335
+ ]);
2336
+ const proxyTitle = (_resolvedContent_proxyTitle = resolvedContent.proxyTitle) != null ? _resolvedContent_proxyTitle : title == null ? ariaLabel : undefined;
2337
+ const proxyDescription = resolvedContent.proxyDescription;
2338
+ const contentAriaLabel = title == null && !proxyTitle ? ariaLabel : undefined;
2339
+ const contentAriaLabelledBy = title == null && !proxyTitle ? ariaLabelledBy : undefined;
2340
+ const contentAriaDescribedBy = description == null && !proxyDescription ? ariaDescribedBy : undefined;
2289
2341
  return /*#__PURE__*/ React__namespace.default.createElement(Drawer.Root, rootProps, triggerText ? /*#__PURE__*/ React__namespace.default.createElement(Drawer.Trigger, {
2290
2342
  asChild: true
2291
2343
  }, /*#__PURE__*/ React__namespace.default.createElement("button", {
@@ -2295,25 +2347,30 @@ function VanillaDrawerRenderer({ options, open, onOpenChange, onDragChange, onRe
2295
2347
  className: overlayClassName
2296
2348
  }), /*#__PURE__*/ React__namespace.default.createElement(Drawer.Content, {
2297
2349
  className: contentClassName,
2298
- "aria-label": title == null ? ariaLabel : undefined,
2299
- "aria-labelledby": title == null ? ariaLabelledBy : undefined,
2300
- "aria-describedby": description == null ? ariaDescribedBy : undefined
2350
+ "aria-label": contentAriaLabel,
2351
+ "aria-labelledby": contentAriaLabelledBy,
2352
+ "aria-describedby": contentAriaDescribedBy
2301
2353
  }, shouldRenderHandle ? /*#__PURE__*/ React__namespace.default.createElement(Drawer.Handle, {
2302
2354
  className: handleClassName
2303
2355
  }) : null, shouldRenderVanillaContent ? /*#__PURE__*/ React__namespace.default.createElement("div", {
2304
2356
  "data-drawer-vanilla-node": ""
2305
- }, title != null ? /*#__PURE__*/ React__namespace.default.createElement(Drawer.Title, {
2357
+ }, proxyTitle ? /*#__PURE__*/ React__namespace.default.createElement(Drawer.Title, {
2358
+ style: VISUALLY_HIDDEN_STYLE
2359
+ }, proxyTitle) : null, title != null ? /*#__PURE__*/ React__namespace.default.createElement(Drawer.Title, {
2306
2360
  style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : undefined
2307
2361
  }, /*#__PURE__*/ React__namespace.default.createElement(VanillaNode, {
2308
2362
  value: title
2309
- })) : null, description != null ? /*#__PURE__*/ React__namespace.default.createElement(Drawer.Description, {
2363
+ })) : null, proxyDescription ? /*#__PURE__*/ React__namespace.default.createElement(Drawer.Description, {
2364
+ style: VISUALLY_HIDDEN_STYLE
2365
+ }, proxyDescription) : null, description != null ? /*#__PURE__*/ React__namespace.default.createElement(Drawer.Description, {
2310
2366
  style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : undefined
2311
2367
  }, /*#__PURE__*/ React__namespace.default.createElement(VanillaNode, {
2312
2368
  value: description
2313
- })) : null, /*#__PURE__*/ React__namespace.default.createElement(VanillaNode, {
2314
- value: content,
2315
- dataAttribute: "data-drawer-vanilla-body"
2316
- })) : null)));
2369
+ })) : null, /*#__PURE__*/ React__namespace.default.createElement("div", {
2370
+ "data-drawer-vanilla-body": ""
2371
+ }, /*#__PURE__*/ React__namespace.default.createElement(VanillaNode, {
2372
+ value: resolvedContent.value
2373
+ }))) : null)));
2317
2374
  }
2318
2375
 
2319
2376
  function canUseDOM$1() {
@@ -2198,6 +2198,7 @@ const VISUALLY_HIDDEN_STYLE = {
2198
2198
  whiteSpace: 'nowrap',
2199
2199
  border: 0
2200
2200
  };
2201
+ const useSafeLayoutEffect = typeof window === 'undefined' ? React__default.useEffect : React__default.useLayoutEffect;
2201
2202
  function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, internalOnReleaseChange) {
2202
2203
  const { id: _id, parentId: _parentId, onDragChange, onReleaseChange, ...drawerOptions } = options;
2203
2204
  const baseProps = {
@@ -2229,9 +2230,11 @@ function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, i
2229
2230
  }
2230
2231
  function VanillaNode({ value, dataAttribute }) {
2231
2232
  const ref = React__default.useRef(null);
2232
- React__default.useEffect(()=>{
2233
+ useSafeLayoutEffect(()=>{
2233
2234
  const element = ref.current;
2234
- if (!element) return;
2235
+ if (!element) {
2236
+ return;
2237
+ }
2235
2238
  element.innerHTML = '';
2236
2239
  if (value instanceof HTMLElement) {
2237
2240
  element.appendChild(value);
@@ -2259,11 +2262,60 @@ function VanillaNode({ value, dataAttribute }) {
2259
2262
  ref: ref
2260
2263
  });
2261
2264
  }
2265
+ function readAccessibleTextFromRoot(root, elementId) {
2266
+ var _root_textContent;
2267
+ if (!root || !elementId) {
2268
+ return undefined;
2269
+ }
2270
+ const elements = Array.from(root.querySelectorAll('[id]'));
2271
+ for (const element of elements){
2272
+ if (element instanceof HTMLElement && element.id === elementId) {
2273
+ var _element_textContent;
2274
+ const value = (_element_textContent = element.textContent) == null ? void 0 : _element_textContent.trim();
2275
+ return value ? value : undefined;
2276
+ }
2277
+ }
2278
+ return root.id === elementId ? ((_root_textContent = root.textContent) == null ? void 0 : _root_textContent.trim()) || undefined : undefined;
2279
+ }
2262
2280
  function VanillaDrawerRenderer({ options, open, onOpenChange, onDragChange, onReleaseChange }) {
2281
+ var _resolvedContent_proxyTitle;
2263
2282
  const { mountElement: _mountElement, triggerElement: _triggerElement, triggerText, showHandle, handleClassName, ariaLabel, ariaLabelledBy, ariaDescribedBy, title, titleVisuallyHidden, description, descriptionVisuallyHidden, content, overlayClassName, contentClassName, ...drawerOptions } = options;
2264
2283
  const rootProps = toReactDrawerProps(drawerOptions, open, onOpenChange, onDragChange, onReleaseChange);
2265
2284
  const shouldRenderHandle = Boolean(drawerOptions.handleOnly || showHandle);
2266
2285
  const shouldRenderVanillaContent = title != null || description != null || content != null;
2286
+ const resolvedContent = React__default.useMemo(()=>{
2287
+ if (content instanceof HTMLElement) {
2288
+ return {
2289
+ value: content,
2290
+ proxyTitle: title == null ? readAccessibleTextFromRoot(content, ariaLabelledBy) : undefined,
2291
+ proxyDescription: description == null ? readAccessibleTextFromRoot(content, ariaDescribedBy) : undefined
2292
+ };
2293
+ }
2294
+ if (typeof content === 'function') {
2295
+ const result = content();
2296
+ return {
2297
+ value: result,
2298
+ proxyTitle: title == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaLabelledBy) : undefined,
2299
+ proxyDescription: description == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaDescribedBy) : undefined
2300
+ };
2301
+ }
2302
+ return {
2303
+ value: content,
2304
+ proxyTitle: undefined,
2305
+ proxyDescription: undefined
2306
+ };
2307
+ }, [
2308
+ ariaDescribedBy,
2309
+ ariaLabelledBy,
2310
+ content,
2311
+ description,
2312
+ title
2313
+ ]);
2314
+ const proxyTitle = (_resolvedContent_proxyTitle = resolvedContent.proxyTitle) != null ? _resolvedContent_proxyTitle : title == null ? ariaLabel : undefined;
2315
+ const proxyDescription = resolvedContent.proxyDescription;
2316
+ const contentAriaLabel = title == null && !proxyTitle ? ariaLabel : undefined;
2317
+ const contentAriaLabelledBy = title == null && !proxyTitle ? ariaLabelledBy : undefined;
2318
+ const contentAriaDescribedBy = description == null && !proxyDescription ? ariaDescribedBy : undefined;
2267
2319
  return /*#__PURE__*/ React__default.createElement(Drawer.Root, rootProps, triggerText ? /*#__PURE__*/ React__default.createElement(Drawer.Trigger, {
2268
2320
  asChild: true
2269
2321
  }, /*#__PURE__*/ React__default.createElement("button", {
@@ -2273,25 +2325,30 @@ function VanillaDrawerRenderer({ options, open, onOpenChange, onDragChange, onRe
2273
2325
  className: overlayClassName
2274
2326
  }), /*#__PURE__*/ React__default.createElement(Drawer.Content, {
2275
2327
  className: contentClassName,
2276
- "aria-label": title == null ? ariaLabel : undefined,
2277
- "aria-labelledby": title == null ? ariaLabelledBy : undefined,
2278
- "aria-describedby": description == null ? ariaDescribedBy : undefined
2328
+ "aria-label": contentAriaLabel,
2329
+ "aria-labelledby": contentAriaLabelledBy,
2330
+ "aria-describedby": contentAriaDescribedBy
2279
2331
  }, shouldRenderHandle ? /*#__PURE__*/ React__default.createElement(Drawer.Handle, {
2280
2332
  className: handleClassName
2281
2333
  }) : null, shouldRenderVanillaContent ? /*#__PURE__*/ React__default.createElement("div", {
2282
2334
  "data-drawer-vanilla-node": ""
2283
- }, title != null ? /*#__PURE__*/ React__default.createElement(Drawer.Title, {
2335
+ }, proxyTitle ? /*#__PURE__*/ React__default.createElement(Drawer.Title, {
2336
+ style: VISUALLY_HIDDEN_STYLE
2337
+ }, proxyTitle) : null, title != null ? /*#__PURE__*/ React__default.createElement(Drawer.Title, {
2284
2338
  style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : undefined
2285
2339
  }, /*#__PURE__*/ React__default.createElement(VanillaNode, {
2286
2340
  value: title
2287
- })) : null, description != null ? /*#__PURE__*/ React__default.createElement(Drawer.Description, {
2341
+ })) : null, proxyDescription ? /*#__PURE__*/ React__default.createElement(Drawer.Description, {
2342
+ style: VISUALLY_HIDDEN_STYLE
2343
+ }, proxyDescription) : null, description != null ? /*#__PURE__*/ React__default.createElement(Drawer.Description, {
2288
2344
  style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : undefined
2289
2345
  }, /*#__PURE__*/ React__default.createElement(VanillaNode, {
2290
2346
  value: description
2291
- })) : null, /*#__PURE__*/ React__default.createElement(VanillaNode, {
2292
- value: content,
2293
- dataAttribute: "data-drawer-vanilla-body"
2294
- })) : null)));
2347
+ })) : null, /*#__PURE__*/ React__default.createElement("div", {
2348
+ "data-drawer-vanilla-body": ""
2349
+ }, /*#__PURE__*/ React__default.createElement(VanillaNode, {
2350
+ value: resolvedContent.value
2351
+ }))) : null)));
2295
2352
  }
2296
2353
 
2297
2354
  function canUseDOM$1() {
@@ -28751,6 +28751,7 @@ var VISUALLY_HIDDEN_STYLE = {
28751
28751
  whiteSpace: "nowrap",
28752
28752
  border: 0
28753
28753
  };
28754
+ var useSafeLayoutEffect = typeof window === "undefined" ? import_react10.default.useEffect : import_react10.default.useLayoutEffect;
28754
28755
  function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, internalOnReleaseChange) {
28755
28756
  const { id: _id, parentId: _parentId, onDragChange, onReleaseChange, ...drawerOptions } = options;
28756
28757
  const baseProps = {
@@ -28779,11 +28780,16 @@ function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, i
28779
28780
  fadeFromIndex: void 0
28780
28781
  };
28781
28782
  }
28782
- function VanillaNode({ value, dataAttribute }) {
28783
+ function VanillaNode({
28784
+ value,
28785
+ dataAttribute
28786
+ }) {
28783
28787
  const ref = import_react10.default.useRef(null);
28784
- import_react10.default.useEffect(() => {
28788
+ useSafeLayoutEffect(() => {
28785
28789
  const element = ref.current;
28786
- if (!element) return;
28790
+ if (!element) {
28791
+ return;
28792
+ }
28787
28793
  element.innerHTML = "";
28788
28794
  if (value instanceof HTMLElement) {
28789
28795
  element.appendChild(value);
@@ -28804,6 +28810,19 @@ function VanillaNode({ value, dataAttribute }) {
28804
28810
  }
28805
28811
  return /* @__PURE__ */ import_react10.default.createElement("div", { ...dataAttribute ? { [dataAttribute]: "" } : {}, ref });
28806
28812
  }
28813
+ function readAccessibleTextFromRoot(root, elementId) {
28814
+ if (!root || !elementId) {
28815
+ return void 0;
28816
+ }
28817
+ const elements = Array.from(root.querySelectorAll("[id]"));
28818
+ for (const element of elements) {
28819
+ if (element instanceof HTMLElement && element.id === elementId) {
28820
+ const value = element.textContent?.trim();
28821
+ return value ? value : void 0;
28822
+ }
28823
+ }
28824
+ return root.id === elementId ? root.textContent?.trim() || void 0 : void 0;
28825
+ }
28807
28826
  function VanillaDrawerRenderer({
28808
28827
  options,
28809
28828
  open,
@@ -28832,16 +28851,43 @@ function VanillaDrawerRenderer({
28832
28851
  const rootProps = toReactDrawerProps(drawerOptions, open, onOpenChange, onDragChange, onReleaseChange);
28833
28852
  const shouldRenderHandle = Boolean(drawerOptions.handleOnly || showHandle);
28834
28853
  const shouldRenderVanillaContent = title != null || description != null || content != null;
28854
+ const resolvedContent = import_react10.default.useMemo(() => {
28855
+ if (content instanceof HTMLElement) {
28856
+ return {
28857
+ value: content,
28858
+ proxyTitle: title == null ? readAccessibleTextFromRoot(content, ariaLabelledBy) : void 0,
28859
+ proxyDescription: description == null ? readAccessibleTextFromRoot(content, ariaDescribedBy) : void 0
28860
+ };
28861
+ }
28862
+ if (typeof content === "function") {
28863
+ const result = content();
28864
+ return {
28865
+ value: result,
28866
+ proxyTitle: title == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaLabelledBy) : void 0,
28867
+ proxyDescription: description == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaDescribedBy) : void 0
28868
+ };
28869
+ }
28870
+ return {
28871
+ value: content,
28872
+ proxyTitle: void 0,
28873
+ proxyDescription: void 0
28874
+ };
28875
+ }, [ariaDescribedBy, ariaLabelledBy, content, description, title]);
28876
+ const proxyTitle = resolvedContent.proxyTitle ?? (title == null ? ariaLabel : void 0);
28877
+ const proxyDescription = resolvedContent.proxyDescription;
28878
+ const contentAriaLabel = title == null && !proxyTitle ? ariaLabel : void 0;
28879
+ const contentAriaLabelledBy = title == null && !proxyTitle ? ariaLabelledBy : void 0;
28880
+ const contentAriaDescribedBy = description == null && !proxyDescription ? ariaDescribedBy : void 0;
28835
28881
  return /* @__PURE__ */ import_react10.default.createElement(Drawer.Root, { ...rootProps }, triggerText ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Trigger, { asChild: true }, /* @__PURE__ */ import_react10.default.createElement("button", { type: "button", "data-drawer-vanilla-trigger": "" }, triggerText)) : null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Portal, null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Overlay, { className: overlayClassName }), /* @__PURE__ */ import_react10.default.createElement(
28836
28882
  Drawer.Content,
28837
28883
  {
28838
28884
  className: contentClassName,
28839
- "aria-label": title == null ? ariaLabel : void 0,
28840
- "aria-labelledby": title == null ? ariaLabelledBy : void 0,
28841
- "aria-describedby": description == null ? ariaDescribedBy : void 0
28885
+ "aria-label": contentAriaLabel,
28886
+ "aria-labelledby": contentAriaLabelledBy,
28887
+ "aria-describedby": contentAriaDescribedBy
28842
28888
  },
28843
28889
  shouldRenderHandle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Handle, { className: handleClassName }) : null,
28844
- shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: content, dataAttribute: "data-drawer-vanilla-body" })) : null
28890
+ shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, proxyTitle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: VISUALLY_HIDDEN_STYLE }, proxyTitle) : null, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, proxyDescription ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: VISUALLY_HIDDEN_STYLE }, proxyDescription) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-body": "" }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: resolvedContent.value }))) : null
28845
28891
  )));
28846
28892
  }
28847
28893
 
@@ -28723,6 +28723,7 @@ var VISUALLY_HIDDEN_STYLE = {
28723
28723
  whiteSpace: "nowrap",
28724
28724
  border: 0
28725
28725
  };
28726
+ var useSafeLayoutEffect = typeof window === "undefined" ? import_react10.default.useEffect : import_react10.default.useLayoutEffect;
28726
28727
  function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, internalOnReleaseChange) {
28727
28728
  const { id: _id, parentId: _parentId, onDragChange, onReleaseChange, ...drawerOptions } = options;
28728
28729
  const baseProps = {
@@ -28751,11 +28752,16 @@ function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, i
28751
28752
  fadeFromIndex: void 0
28752
28753
  };
28753
28754
  }
28754
- function VanillaNode({ value, dataAttribute }) {
28755
+ function VanillaNode({
28756
+ value,
28757
+ dataAttribute
28758
+ }) {
28755
28759
  const ref = import_react10.default.useRef(null);
28756
- import_react10.default.useEffect(() => {
28760
+ useSafeLayoutEffect(() => {
28757
28761
  const element = ref.current;
28758
- if (!element) return;
28762
+ if (!element) {
28763
+ return;
28764
+ }
28759
28765
  element.innerHTML = "";
28760
28766
  if (value instanceof HTMLElement) {
28761
28767
  element.appendChild(value);
@@ -28776,6 +28782,19 @@ function VanillaNode({ value, dataAttribute }) {
28776
28782
  }
28777
28783
  return /* @__PURE__ */ import_react10.default.createElement("div", { ...dataAttribute ? { [dataAttribute]: "" } : {}, ref });
28778
28784
  }
28785
+ function readAccessibleTextFromRoot(root, elementId) {
28786
+ if (!root || !elementId) {
28787
+ return void 0;
28788
+ }
28789
+ const elements = Array.from(root.querySelectorAll("[id]"));
28790
+ for (const element of elements) {
28791
+ if (element instanceof HTMLElement && element.id === elementId) {
28792
+ const value = element.textContent?.trim();
28793
+ return value ? value : void 0;
28794
+ }
28795
+ }
28796
+ return root.id === elementId ? root.textContent?.trim() || void 0 : void 0;
28797
+ }
28779
28798
  function VanillaDrawerRenderer({
28780
28799
  options,
28781
28800
  open,
@@ -28804,16 +28823,43 @@ function VanillaDrawerRenderer({
28804
28823
  const rootProps = toReactDrawerProps(drawerOptions, open, onOpenChange, onDragChange, onReleaseChange);
28805
28824
  const shouldRenderHandle = Boolean(drawerOptions.handleOnly || showHandle);
28806
28825
  const shouldRenderVanillaContent = title != null || description != null || content != null;
28826
+ const resolvedContent = import_react10.default.useMemo(() => {
28827
+ if (content instanceof HTMLElement) {
28828
+ return {
28829
+ value: content,
28830
+ proxyTitle: title == null ? readAccessibleTextFromRoot(content, ariaLabelledBy) : void 0,
28831
+ proxyDescription: description == null ? readAccessibleTextFromRoot(content, ariaDescribedBy) : void 0
28832
+ };
28833
+ }
28834
+ if (typeof content === "function") {
28835
+ const result = content();
28836
+ return {
28837
+ value: result,
28838
+ proxyTitle: title == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaLabelledBy) : void 0,
28839
+ proxyDescription: description == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaDescribedBy) : void 0
28840
+ };
28841
+ }
28842
+ return {
28843
+ value: content,
28844
+ proxyTitle: void 0,
28845
+ proxyDescription: void 0
28846
+ };
28847
+ }, [ariaDescribedBy, ariaLabelledBy, content, description, title]);
28848
+ const proxyTitle = resolvedContent.proxyTitle ?? (title == null ? ariaLabel : void 0);
28849
+ const proxyDescription = resolvedContent.proxyDescription;
28850
+ const contentAriaLabel = title == null && !proxyTitle ? ariaLabel : void 0;
28851
+ const contentAriaLabelledBy = title == null && !proxyTitle ? ariaLabelledBy : void 0;
28852
+ const contentAriaDescribedBy = description == null && !proxyDescription ? ariaDescribedBy : void 0;
28807
28853
  return /* @__PURE__ */ import_react10.default.createElement(Drawer.Root, { ...rootProps }, triggerText ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Trigger, { asChild: true }, /* @__PURE__ */ import_react10.default.createElement("button", { type: "button", "data-drawer-vanilla-trigger": "" }, triggerText)) : null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Portal, null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Overlay, { className: overlayClassName }), /* @__PURE__ */ import_react10.default.createElement(
28808
28854
  Drawer.Content,
28809
28855
  {
28810
28856
  className: contentClassName,
28811
- "aria-label": title == null ? ariaLabel : void 0,
28812
- "aria-labelledby": title == null ? ariaLabelledBy : void 0,
28813
- "aria-describedby": description == null ? ariaDescribedBy : void 0
28857
+ "aria-label": contentAriaLabel,
28858
+ "aria-labelledby": contentAriaLabelledBy,
28859
+ "aria-describedby": contentAriaDescribedBy
28814
28860
  },
28815
28861
  shouldRenderHandle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Handle, { className: handleClassName }) : null,
28816
- shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: content, dataAttribute: "data-drawer-vanilla-body" })) : null
28862
+ shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, proxyTitle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: VISUALLY_HIDDEN_STYLE }, proxyTitle) : null, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, proxyDescription ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: VISUALLY_HIDDEN_STYLE }, proxyDescription) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-body": "" }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: resolvedContent.value }))) : null
28817
28863
  )));
28818
28864
  }
28819
28865
 
package/dist/vue/index.js CHANGED
@@ -28751,6 +28751,7 @@ var VISUALLY_HIDDEN_STYLE = {
28751
28751
  whiteSpace: "nowrap",
28752
28752
  border: 0
28753
28753
  };
28754
+ var useSafeLayoutEffect = typeof window === "undefined" ? import_react10.default.useEffect : import_react10.default.useLayoutEffect;
28754
28755
  function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, internalOnReleaseChange) {
28755
28756
  const { id: _id, parentId: _parentId, onDragChange, onReleaseChange, ...drawerOptions } = options;
28756
28757
  const baseProps = {
@@ -28779,11 +28780,16 @@ function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, i
28779
28780
  fadeFromIndex: void 0
28780
28781
  };
28781
28782
  }
28782
- function VanillaNode({ value, dataAttribute }) {
28783
+ function VanillaNode({
28784
+ value,
28785
+ dataAttribute
28786
+ }) {
28783
28787
  const ref = import_react10.default.useRef(null);
28784
- import_react10.default.useEffect(() => {
28788
+ useSafeLayoutEffect(() => {
28785
28789
  const element = ref.current;
28786
- if (!element) return;
28790
+ if (!element) {
28791
+ return;
28792
+ }
28787
28793
  element.innerHTML = "";
28788
28794
  if (value instanceof HTMLElement) {
28789
28795
  element.appendChild(value);
@@ -28804,6 +28810,19 @@ function VanillaNode({ value, dataAttribute }) {
28804
28810
  }
28805
28811
  return /* @__PURE__ */ import_react10.default.createElement("div", { ...dataAttribute ? { [dataAttribute]: "" } : {}, ref });
28806
28812
  }
28813
+ function readAccessibleTextFromRoot(root, elementId) {
28814
+ if (!root || !elementId) {
28815
+ return void 0;
28816
+ }
28817
+ const elements = Array.from(root.querySelectorAll("[id]"));
28818
+ for (const element of elements) {
28819
+ if (element instanceof HTMLElement && element.id === elementId) {
28820
+ const value = element.textContent?.trim();
28821
+ return value ? value : void 0;
28822
+ }
28823
+ }
28824
+ return root.id === elementId ? root.textContent?.trim() || void 0 : void 0;
28825
+ }
28807
28826
  function VanillaDrawerRenderer({
28808
28827
  options,
28809
28828
  open,
@@ -28832,16 +28851,43 @@ function VanillaDrawerRenderer({
28832
28851
  const rootProps = toReactDrawerProps(drawerOptions, open, onOpenChange, onDragChange, onReleaseChange);
28833
28852
  const shouldRenderHandle = Boolean(drawerOptions.handleOnly || showHandle);
28834
28853
  const shouldRenderVanillaContent = title != null || description != null || content != null;
28854
+ const resolvedContent = import_react10.default.useMemo(() => {
28855
+ if (content instanceof HTMLElement) {
28856
+ return {
28857
+ value: content,
28858
+ proxyTitle: title == null ? readAccessibleTextFromRoot(content, ariaLabelledBy) : void 0,
28859
+ proxyDescription: description == null ? readAccessibleTextFromRoot(content, ariaDescribedBy) : void 0
28860
+ };
28861
+ }
28862
+ if (typeof content === "function") {
28863
+ const result = content();
28864
+ return {
28865
+ value: result,
28866
+ proxyTitle: title == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaLabelledBy) : void 0,
28867
+ proxyDescription: description == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaDescribedBy) : void 0
28868
+ };
28869
+ }
28870
+ return {
28871
+ value: content,
28872
+ proxyTitle: void 0,
28873
+ proxyDescription: void 0
28874
+ };
28875
+ }, [ariaDescribedBy, ariaLabelledBy, content, description, title]);
28876
+ const proxyTitle = resolvedContent.proxyTitle ?? (title == null ? ariaLabel : void 0);
28877
+ const proxyDescription = resolvedContent.proxyDescription;
28878
+ const contentAriaLabel = title == null && !proxyTitle ? ariaLabel : void 0;
28879
+ const contentAriaLabelledBy = title == null && !proxyTitle ? ariaLabelledBy : void 0;
28880
+ const contentAriaDescribedBy = description == null && !proxyDescription ? ariaDescribedBy : void 0;
28835
28881
  return /* @__PURE__ */ import_react10.default.createElement(Drawer.Root, { ...rootProps }, triggerText ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Trigger, { asChild: true }, /* @__PURE__ */ import_react10.default.createElement("button", { type: "button", "data-drawer-vanilla-trigger": "" }, triggerText)) : null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Portal, null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Overlay, { className: overlayClassName }), /* @__PURE__ */ import_react10.default.createElement(
28836
28882
  Drawer.Content,
28837
28883
  {
28838
28884
  className: contentClassName,
28839
- "aria-label": title == null ? ariaLabel : void 0,
28840
- "aria-labelledby": title == null ? ariaLabelledBy : void 0,
28841
- "aria-describedby": description == null ? ariaDescribedBy : void 0
28885
+ "aria-label": contentAriaLabel,
28886
+ "aria-labelledby": contentAriaLabelledBy,
28887
+ "aria-describedby": contentAriaDescribedBy
28842
28888
  },
28843
28889
  shouldRenderHandle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Handle, { className: handleClassName }) : null,
28844
- shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: content, dataAttribute: "data-drawer-vanilla-body" })) : null
28890
+ shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, proxyTitle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: VISUALLY_HIDDEN_STYLE }, proxyTitle) : null, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, proxyDescription ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: VISUALLY_HIDDEN_STYLE }, proxyDescription) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-body": "" }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: resolvedContent.value }))) : null
28845
28891
  )));
28846
28892
  }
28847
28893
 
@@ -28726,6 +28726,7 @@ var VISUALLY_HIDDEN_STYLE = {
28726
28726
  whiteSpace: "nowrap",
28727
28727
  border: 0
28728
28728
  };
28729
+ var useSafeLayoutEffect = typeof window === "undefined" ? import_react10.default.useEffect : import_react10.default.useLayoutEffect;
28729
28730
  function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, internalOnReleaseChange) {
28730
28731
  const { id: _id, parentId: _parentId, onDragChange, onReleaseChange, ...drawerOptions } = options;
28731
28732
  const baseProps = {
@@ -28754,11 +28755,16 @@ function toReactDrawerProps(options, open, onOpenChange, internalOnDragChange, i
28754
28755
  fadeFromIndex: void 0
28755
28756
  };
28756
28757
  }
28757
- function VanillaNode({ value, dataAttribute }) {
28758
+ function VanillaNode({
28759
+ value,
28760
+ dataAttribute
28761
+ }) {
28758
28762
  const ref = import_react10.default.useRef(null);
28759
- import_react10.default.useEffect(() => {
28763
+ useSafeLayoutEffect(() => {
28760
28764
  const element = ref.current;
28761
- if (!element) return;
28765
+ if (!element) {
28766
+ return;
28767
+ }
28762
28768
  element.innerHTML = "";
28763
28769
  if (value instanceof HTMLElement) {
28764
28770
  element.appendChild(value);
@@ -28779,6 +28785,19 @@ function VanillaNode({ value, dataAttribute }) {
28779
28785
  }
28780
28786
  return /* @__PURE__ */ import_react10.default.createElement("div", { ...dataAttribute ? { [dataAttribute]: "" } : {}, ref });
28781
28787
  }
28788
+ function readAccessibleTextFromRoot(root, elementId) {
28789
+ if (!root || !elementId) {
28790
+ return void 0;
28791
+ }
28792
+ const elements = Array.from(root.querySelectorAll("[id]"));
28793
+ for (const element of elements) {
28794
+ if (element instanceof HTMLElement && element.id === elementId) {
28795
+ const value = element.textContent?.trim();
28796
+ return value ? value : void 0;
28797
+ }
28798
+ }
28799
+ return root.id === elementId ? root.textContent?.trim() || void 0 : void 0;
28800
+ }
28782
28801
  function VanillaDrawerRenderer({
28783
28802
  options,
28784
28803
  open,
@@ -28807,16 +28826,43 @@ function VanillaDrawerRenderer({
28807
28826
  const rootProps = toReactDrawerProps(drawerOptions, open, onOpenChange, onDragChange, onReleaseChange);
28808
28827
  const shouldRenderHandle = Boolean(drawerOptions.handleOnly || showHandle);
28809
28828
  const shouldRenderVanillaContent = title != null || description != null || content != null;
28829
+ const resolvedContent = import_react10.default.useMemo(() => {
28830
+ if (content instanceof HTMLElement) {
28831
+ return {
28832
+ value: content,
28833
+ proxyTitle: title == null ? readAccessibleTextFromRoot(content, ariaLabelledBy) : void 0,
28834
+ proxyDescription: description == null ? readAccessibleTextFromRoot(content, ariaDescribedBy) : void 0
28835
+ };
28836
+ }
28837
+ if (typeof content === "function") {
28838
+ const result = content();
28839
+ return {
28840
+ value: result,
28841
+ proxyTitle: title == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaLabelledBy) : void 0,
28842
+ proxyDescription: description == null && result instanceof HTMLElement ? readAccessibleTextFromRoot(result, ariaDescribedBy) : void 0
28843
+ };
28844
+ }
28845
+ return {
28846
+ value: content,
28847
+ proxyTitle: void 0,
28848
+ proxyDescription: void 0
28849
+ };
28850
+ }, [ariaDescribedBy, ariaLabelledBy, content, description, title]);
28851
+ const proxyTitle = resolvedContent.proxyTitle ?? (title == null ? ariaLabel : void 0);
28852
+ const proxyDescription = resolvedContent.proxyDescription;
28853
+ const contentAriaLabel = title == null && !proxyTitle ? ariaLabel : void 0;
28854
+ const contentAriaLabelledBy = title == null && !proxyTitle ? ariaLabelledBy : void 0;
28855
+ const contentAriaDescribedBy = description == null && !proxyDescription ? ariaDescribedBy : void 0;
28810
28856
  return /* @__PURE__ */ import_react10.default.createElement(Drawer.Root, { ...rootProps }, triggerText ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Trigger, { asChild: true }, /* @__PURE__ */ import_react10.default.createElement("button", { type: "button", "data-drawer-vanilla-trigger": "" }, triggerText)) : null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Portal, null, /* @__PURE__ */ import_react10.default.createElement(Drawer.Overlay, { className: overlayClassName }), /* @__PURE__ */ import_react10.default.createElement(
28811
28857
  Drawer.Content,
28812
28858
  {
28813
28859
  className: contentClassName,
28814
- "aria-label": title == null ? ariaLabel : void 0,
28815
- "aria-labelledby": title == null ? ariaLabelledBy : void 0,
28816
- "aria-describedby": description == null ? ariaDescribedBy : void 0
28860
+ "aria-label": contentAriaLabel,
28861
+ "aria-labelledby": contentAriaLabelledBy,
28862
+ "aria-describedby": contentAriaDescribedBy
28817
28863
  },
28818
28864
  shouldRenderHandle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Handle, { className: handleClassName }) : null,
28819
- shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: content, dataAttribute: "data-drawer-vanilla-body" })) : null
28865
+ shouldRenderVanillaContent ? /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-node": "" }, proxyTitle ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: VISUALLY_HIDDEN_STYLE }, proxyTitle) : null, title != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Title, { style: titleVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: title })) : null, proxyDescription ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: VISUALLY_HIDDEN_STYLE }, proxyDescription) : null, description != null ? /* @__PURE__ */ import_react10.default.createElement(Drawer.Description, { style: descriptionVisuallyHidden ? VISUALLY_HIDDEN_STYLE : void 0 }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: description })) : null, /* @__PURE__ */ import_react10.default.createElement("div", { "data-drawer-vanilla-body": "" }, /* @__PURE__ */ import_react10.default.createElement(VanillaNode, { value: resolvedContent.value }))) : null
28820
28866
  )));
28821
28867
  }
28822
28868
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@samline/drawer",
3
- "version": "2.0.2",
3
+ "version": "2.0.4",
4
4
  "description": "A universal drawer package for React, Vue, Svelte, vanilla JS, and browser usage.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",