@accelint/design-toolkit 5.2.0 → 6.0.0

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 (85) hide show
  1. package/catalog-info.yaml +44 -0
  2. package/dist/components/accordion/index.js +1 -1
  3. package/dist/components/accordion/index.js.map +1 -1
  4. package/dist/components/accordion/styles.d.ts +3 -3
  5. package/dist/components/accordion/styles.js +1 -1
  6. package/dist/components/accordion/styles.js.map +1 -1
  7. package/dist/components/action-bar/index.d.ts +11 -0
  8. package/dist/components/action-bar/index.js.map +1 -1
  9. package/dist/components/breadcrumbs/index.d.ts +12 -0
  10. package/dist/components/breadcrumbs/index.js.map +1 -1
  11. package/dist/components/button/styles.js +1 -1
  12. package/dist/components/button/styles.js.map +1 -1
  13. package/dist/components/clock/index.d.ts +39 -0
  14. package/dist/components/clock/index.js +4 -0
  15. package/dist/components/clock/index.js.map +1 -0
  16. package/dist/components/clock/types.d.ts +7 -0
  17. package/dist/components/clock/types.js +2 -0
  18. package/dist/components/clock/types.js.map +1 -0
  19. package/dist/components/combobox-field/index.d.ts +11 -0
  20. package/dist/components/combobox-field/index.js.map +1 -1
  21. package/dist/components/combobox-field/styles.js +1 -1
  22. package/dist/components/combobox-field/styles.js.map +1 -1
  23. package/dist/components/dialog/index.js +1 -1
  24. package/dist/components/dialog/index.js.map +1 -1
  25. package/dist/components/drawer/index.d.ts +36 -1
  26. package/dist/components/drawer/index.js +1 -1
  27. package/dist/components/drawer/index.js.map +1 -1
  28. package/dist/components/lines/index.d.ts +9 -0
  29. package/dist/components/lines/index.js.map +1 -1
  30. package/dist/components/link/index.d.ts +9 -0
  31. package/dist/components/link/index.js.map +1 -1
  32. package/dist/components/link/styles.js +1 -1
  33. package/dist/components/link/styles.js.map +1 -1
  34. package/dist/components/notice/events.d.ts +10 -0
  35. package/dist/components/notice/events.js +2 -0
  36. package/dist/components/notice/events.js.map +1 -0
  37. package/dist/components/notice/index.d.ts +20 -0
  38. package/dist/components/notice/index.js +4 -0
  39. package/dist/components/notice/index.js.map +1 -0
  40. package/dist/components/notice/styles.d.ts +60 -0
  41. package/dist/components/notice/styles.js +2 -0
  42. package/dist/components/notice/styles.js.map +1 -0
  43. package/dist/components/notice/types.d.ts +75 -0
  44. package/dist/components/notice/types.js +2 -0
  45. package/dist/components/notice/types.js.map +1 -0
  46. package/dist/components/query-builder/index.js +1 -1
  47. package/dist/components/query-builder/index.js.map +1 -1
  48. package/dist/components/sidenav/index.d.ts +56 -0
  49. package/dist/components/sidenav/index.js +1 -1
  50. package/dist/components/sidenav/index.js.map +1 -1
  51. package/dist/components/slider/index.js +1 -1
  52. package/dist/components/slider/index.js.map +1 -1
  53. package/dist/components/slider/styles.js +1 -1
  54. package/dist/components/slider/styles.js.map +1 -1
  55. package/dist/components/table/index.d.ts +9 -0
  56. package/dist/components/table/index.js +1 -1
  57. package/dist/components/table/index.js.map +1 -1
  58. package/dist/components/tabs/styles.js +1 -1
  59. package/dist/components/tabs/styles.js.map +1 -1
  60. package/dist/components/time-field/index.d.ts +9 -0
  61. package/dist/components/time-field/index.js.map +1 -1
  62. package/dist/components/tooltip/index.d.ts +23 -34
  63. package/dist/components/tooltip/index.js +1 -1
  64. package/dist/components/tooltip/index.js.map +1 -1
  65. package/dist/components/tooltip/types.d.ts +5 -6
  66. package/dist/components/tree/index.d.ts +22 -1
  67. package/dist/components/tree/index.js +1 -1
  68. package/dist/components/tree/index.js.map +1 -1
  69. package/dist/components/tree/styles.js +1 -1
  70. package/dist/components/tree/styles.js.map +1 -1
  71. package/dist/components/view-stack/index.d.ts +42 -2
  72. package/dist/components/view-stack/index.js +1 -1
  73. package/dist/components/view-stack/index.js.map +1 -1
  74. package/dist/index.css +5 -3
  75. package/dist/index.d.ts +12 -5
  76. package/dist/index.js +1 -1
  77. package/dist/metafile-esm.json +1 -1
  78. package/dist/providers/portal.d.ts +9 -0
  79. package/dist/providers/portal.js +2 -0
  80. package/dist/providers/portal.js.map +1 -0
  81. package/dist/providers/theme-provider.d.ts +6 -6
  82. package/dist/providers/theme-provider.js +1 -1
  83. package/dist/providers/theme-provider.js.map +1 -1
  84. package/dist/styles.css +372 -128
  85. package/package.json +33 -17
@@ -1,9 +1,9 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { ContextValue } from 'react-aria-components';
4
- import { TooltipProps, TooltipTriggerProps, TooltipBodyProps } from './types.js';
4
+ import { TooltipProps, TooltipTriggerProps } from './types.js';
5
5
 
6
- declare const TooltipContext: react.Context<ContextValue<TooltipProps, HTMLDivElement>>;
6
+ declare const TooltipContext: react.Context<ContextValue<TooltipTriggerProps, HTMLDivElement>>;
7
7
  /**
8
8
  * Tooltip - A contextual popup component for providing additional information
9
9
  *
@@ -13,52 +13,41 @@ declare const TooltipContext: react.Context<ContextValue<TooltipProps, HTMLDivEl
13
13
  *
14
14
  * @example
15
15
  * // Basic tooltip
16
- * <Tooltip>
17
- * <Tooltip.Trigger>
18
- * <Button>Hover me</Button>
19
- * </Tooltip.Trigger>
20
- * <Tooltip.Body>
16
+ * <Tooltip.Trigger>
17
+ * <Button>Hover me</Button>
18
+ * <Tooltip>
21
19
  * This is helpful information
22
- * </Tooltip.Body>
23
- * </Tooltip>
20
+ * </Tooltip>
21
+ * </Tooltip.Trigger>
24
22
  *
25
23
  * @example
26
24
  * // Tooltip with custom positioning
27
- * <Tooltip>
28
- * <Tooltip.Trigger>
29
- * <Button>Hover for info</Button>
30
- * </Tooltip.Trigger>
31
- * <Tooltip.Body placement="top" offset={10}>
25
+ * <Tooltip.Trigger>
26
+ * <Button>Hover for info</Button>
27
+ * <Tooltip placement="top" offset={10}>
32
28
  * Positioned above with custom offset
33
- * </Tooltip.Body>
34
- * </Tooltip>
29
+ * </Tooltip>
30
+ * </Tooltip.Trigger>
35
31
  *
36
32
  * @example
37
33
  * // Icon with tooltip
38
- * <Tooltip>
39
- * <Tooltip.Trigger>
40
- * <Button variant="icon">
41
- * <Icon><Info /></Icon>
42
- * </Button>
43
- * </Tooltip.Trigger>
44
- * <Tooltip.Body>
34
+ * <Tooltip.Trigger>
35
+ * <Button variant="icon">
36
+ * <Icon><Info /></Icon>
37
+ * </Button>
38
+ * <Tooltip>
45
39
  * Additional context for this action
46
- * </Tooltip.Body>
47
- * </Tooltip>
40
+ * </Tooltip>
41
+ * </Tooltip.Trigger>
48
42
  */
49
- declare function Tooltip({ ref, ...props }: TooltipProps): react_jsx_runtime.JSX.Element;
50
- declare namespace Tooltip {
51
- var displayName: string;
52
- var Trigger: typeof TooltipTrigger;
53
- var Body: typeof TooltipBody;
54
- }
55
- declare function TooltipTrigger({ children, ...props }: TooltipTriggerProps): react_jsx_runtime.JSX.Element;
43
+ declare function TooltipTrigger({ ref, ...props }: TooltipTriggerProps): react_jsx_runtime.JSX.Element;
56
44
  declare namespace TooltipTrigger {
57
45
  var displayName: string;
58
46
  }
59
- declare function TooltipBody({ children, parentRef, className, offset, placement, ...props }: TooltipBodyProps): react_jsx_runtime.JSX.Element;
60
- declare namespace TooltipBody {
47
+ declare function Tooltip({ children, parentRef, className, offset, placement, ...props }: TooltipProps): react_jsx_runtime.JSX.Element;
48
+ declare namespace Tooltip {
61
49
  var displayName: string;
50
+ var Trigger: typeof TooltipTrigger;
62
51
  }
63
52
 
64
53
  export { Tooltip, TooltipContext };
@@ -1,4 +1,4 @@
1
1
  'use client';
2
2
 
3
- import {jsx}from'react/jsx-runtime';import'client-only';import {UNSAFE_PortalProvider}from'@react-aria/overlays';import {useIsSSR}from'@react-aria/ssr';import {createContext,useState,useEffect}from'react';import {useContextProps,TooltipTrigger,Focusable,Tooltip,composeRenderProps}from'react-aria-components';import {containsExactChildren}from'./../../lib/react.js';import {TooltipStyles}from'./styles.js';const B=createContext(null);function p({ref:t,...o}){[o,t]=useContextProps(o,t??null,B);const{children:r,delay:s=250,...a}=o;return containsExactChildren({children:r,componentName:p.displayName,restrictions:[[m,{min:1,max:1}],[T,{min:1,max:1}]]}),jsx(TooltipTrigger,{...a,delay:s,children:r})}p.displayName="Tooltip";function m({children:t,...o}){return jsx(Focusable,{...o,children:t})}m.displayName="Tooltip.Trigger";function T({children:t,parentRef:o,className:r,offset:s=5,placement:a="bottom",...u}){const i=useIsSSR(),[d,c]=useState(i?null:document.body);return useEffect(()=>{const l=o?.current,e=i?null:document.createElement("div");return e?.setAttribute("style","position: absolute;"),l&&e&&(l.appendChild(e),c(e)),()=>{e?.remove(),c(i?null:document.body);}},[i,o]),jsx(UNSAFE_PortalProvider,{getContainer:()=>d,children:jsx(Tooltip,{...u,className:composeRenderProps(r,l=>TooltipStyles({className:l})),offset:s,placement:a,children:t})})}T.displayName="Tooltip.Body",p.Trigger=m,p.Body=T;export{p as Tooltip,B as TooltipContext};//# sourceMappingURL=index.js.map
3
+ import {jsx,jsxs,Fragment}from'react/jsx-runtime';import'client-only';import {useFocusable}from'@react-aria/interactions';import {useIsSSR}from'@react-aria/ssr';import {useObjectRef,mergeRefs,mergeProps}from'@react-aria/utils';import {createContext,Children,version,cloneElement}from'react';import {Tooltip,composeRenderProps,useContextProps,TooltipTrigger}from'react-aria-components';import {containsExactChildren}from'./../../lib/react.js';import {PortalProvider}from'./../../providers/portal.js';import {TooltipStyles}from'./styles.js';const S=createContext(null);function h({children:t,ref:e,...r}){e=useObjectRef(e);const{focusableProps:i}=useFocusable(r,e),[o,s]=Children.toArray(t),a=Number.parseInt(version,10)<19?o.ref:o.props.ref;return jsxs(Fragment,{children:[cloneElement(o,{...mergeProps(i,o.props),ref:mergeRefs(a,e)}),s]})}function p({ref:t,...e}){[e,t]=useContextProps(e,t??null,S);const{children:r,delay:i=250,...o}=e;return containsExactChildren({children:r,componentName:p.displayName,restrictions:[[n,{min:1,max:1}]]}),jsx(TooltipTrigger,{...o,delay:i,children:jsx(h,{ref:t,children:r})})}p.displayName="Tooltip.Trigger";function n({children:t,parentRef:e,className:r,offset:i=5,placement:o="bottom",...s}){const m=useIsSSR()?null:document.createElement("div");return m?.setAttribute("class","absolute"),jsx(PortalProvider,{parentRef:e,inject:m,children:jsx(Tooltip,{...s,className:composeRenderProps(r,c=>TooltipStyles({className:c})),offset:i,placement:o,children:t})})}n.displayName="Tooltip",n.Trigger=p;export{n as Tooltip,S as TooltipContext};//# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/tooltip/index.tsx"],"names":["P","props","useContextProps","ref","TooltipContext","A","E","Tooltip","jsx","AriaTooltipTrigger","rest","delay","Focusable","n","b","children","TooltipTrigger","parentRef","className","placement","isSSR","portal","g","x","useEffect","node","port","setPortal","UNSAFE_PortalProvider","y","AriaTooltip","C","S","v","offset","TooltipBody"],"mappings":"sZA8EO,MAAA,CAAA,CAAAA,aAAA,CAAA,IAAmB,EAAA,SAAc,CAAiB,CACvD,CAACC,GAAU,CAAA,CAAIC,CAAAA,GAAuBC,CAAAA,CAAAA,CAAO,KAAMC,CAAc,CAAAC,eAEjE,CAAA,CAAA,CAAA,CAAA,EAAQ,IAAA,CAAA,CAAA,CAAA,CAAA,KAAU,CAAA,QAAQ,CAAK,CAAA,CAAA,KAAYJ,CAE3C,CAAA,CAAA,GAAA,CAAA,GAAsB,CACpB,CAAA,CAAA,CAAA,CAAA,OACAK,qBAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CAAeC,aAAQ,CACvB,CAAA,CAAA,WAAc,CACZ,YAA2B,CAAA,CAAK,CAAE,CAAC,CAAA,CACnC,GAAc,CAAE,CAAA,CAAA,GAAK,CAAG,CAAA,CAAA,CAAA,CAAK,CAAE,CAAC,CAClC,CACF,GAGEC,CAAAA,CAACC,CAAAA,GAAoB,CAAA,CAAGC,CAAAA,CAAM,QAAOC,cAAAA,CAClC,CAAA,GAAA,CAAA,CAAA,KACH,CAEJ,CACAJ,CAAAA,QAAQ,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,WAEtB,CAAA,SAA0B,CAAA,SAAU,CAAA,CAAA,CAAGN,QACrC,CAAA,CAAA,CAAOO,GAACI,CAAA,CAAW,CAAA,CAAA,OAAWC,GAAA,CAAAC,SAAA,CAAA,CAAAC,GAChC,CACAC,CAAAA,QAAe,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,WAAA,CAAA,iBAG3B,CAAA,SACA,CAAA,CAAA,CAAA,QAAAC,CACA,CAAA,CAAA,SAAAC,CACA,CAAA,CAAA,SACA,CAAA,CAAA,CAAA,MAAA,CAAAC,CAAAA,CAAY,CAAA,CAAA,SACZ,CAAGlB,CACL,CAAA,QACQmB,CAAAA,GAAiB,CAAA,CACjB,CAACC,CAAAA,MAA8BD,CAAAA,CAAQE,QAAA,EAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAAC,QAAA,CAAA,CAAA,CAAS,IAAI,CAAA,QAEjEC,CAAAA,IAAU,CAAM,CACd,OAAMC,SAAOR,CAAAA,IAAW,CAAA,MAElBS,CAAON,CAAAA,CAAQ,EAAA,OAAO,CAAA,CAAA,CAAA,CAAA,CAAS,IAAA,CAAA,QAAA,CAAc,aACnD,CAAAM,KAAM,CAAA,CAAA,OAAA,CAAA,EAAa,0CAGZ,CAAA,CAAA,CAAA,EAAA,CAAA,GAAYA,CAAI,CAAA,WAKV,CACXA,CAAAA,CAAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAENC,CAAUP,CAAAA,EAAQ,MAAO,EAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CACxC,QACmB,CAAA,IAGlBQ,EAAA,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAf,GAAA,CAAAgB,qBAAA,CAAc,aACnC,CAAA,IAACC,CAAA,CACE,QACD,CAAAjB,GAAA,CAAAkB,OAAA,CAAA,CAAA,GAA8Bb,CAAAA,CAAYA,SACxB,CAAAc,kBAAA,CAAA,CAAA,CAAA,CAAA,EAAUC,aAAC,CAC7B,CAAA,SACQC,CACR,CAAA,CAAA,CAAA,CAAA,CAAA,MAAWf,CAEV,CAAA,CAAA,SACH,CAAA,CACF,CAEJ,QACY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,WAAA,CAAA,eAGlB,CAAA,CAAA,OAAOgB,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,IAAAA,CAAAA,CAAAA","file":"index.js","sourcesContent":["/*\n * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n'use client';\n\nimport 'client-only';\nimport { UNSAFE_PortalProvider } from '@react-aria/overlays';\nimport { useIsSSR } from '@react-aria/ssr';\nimport { createContext, useEffect, useState } from 'react';\nimport {\n Tooltip as AriaTooltip,\n TooltipTrigger as AriaTooltipTrigger,\n type ContextValue,\n composeRenderProps,\n Focusable,\n useContextProps,\n} from 'react-aria-components';\nimport { containsExactChildren } from '@/lib/react';\nimport { TooltipStyles } from './styles';\nimport type {\n TooltipBodyProps,\n TooltipProps,\n TooltipTriggerProps,\n} from './types';\n\nexport const TooltipContext =\n createContext<ContextValue<TooltipProps, HTMLDivElement>>(null);\n\n/**\n * Tooltip - A contextual popup component for providing additional information\n *\n * Displays helpful information when users hover over or focus on an element.\n * Provides accessible tooltip functionality with proper positioning, keyboard\n * navigation, and screen reader support for enhanced user experience.\n *\n * @example\n * // Basic tooltip\n * <Tooltip>\n * <Tooltip.Trigger>\n * <Button>Hover me</Button>\n * </Tooltip.Trigger>\n * <Tooltip.Body>\n * This is helpful information\n * </Tooltip.Body>\n * </Tooltip>\n *\n * @example\n * // Tooltip with custom positioning\n * <Tooltip>\n * <Tooltip.Trigger>\n * <Button>Hover for info</Button>\n * </Tooltip.Trigger>\n * <Tooltip.Body placement=\"top\" offset={10}>\n * Positioned above with custom offset\n * </Tooltip.Body>\n * </Tooltip>\n *\n * @example\n * // Icon with tooltip\n * <Tooltip>\n * <Tooltip.Trigger>\n * <Button variant=\"icon\">\n * <Icon><Info /></Icon>\n * </Button>\n * </Tooltip.Trigger>\n * <Tooltip.Body>\n * Additional context for this action\n * </Tooltip.Body>\n * </Tooltip>\n */\nexport function Tooltip({ ref, ...props }: TooltipProps) {\n [props, ref] = useContextProps(props, ref ?? null, TooltipContext);\n\n const { children, delay = 250, ...rest } = props;\n\n containsExactChildren({\n children,\n componentName: Tooltip.displayName,\n restrictions: [\n [TooltipTrigger, { min: 1, max: 1 }],\n [TooltipBody, { min: 1, max: 1 }],\n ],\n });\n\n return (\n <AriaTooltipTrigger {...rest} delay={delay}>\n {children}\n </AriaTooltipTrigger>\n );\n}\nTooltip.displayName = 'Tooltip';\n\nfunction TooltipTrigger({ children, ...props }: TooltipTriggerProps) {\n return <Focusable {...props}>{children}</Focusable>;\n}\nTooltipTrigger.displayName = 'Tooltip.Trigger';\n\nfunction TooltipBody({\n children,\n parentRef,\n className,\n offset = 5,\n placement = 'bottom',\n ...props\n}: TooltipBodyProps) {\n const isSSR = useIsSSR();\n const [portal, setPortal] = useState(isSSR ? null : document.body);\n\n useEffect(() => {\n const node = parentRef?.current;\n // TODO: Ensure proper ssr hydration\n const port = isSSR ? null : document.createElement('div');\n port?.setAttribute('style', 'position: absolute;');\n\n if (node && port) {\n node.appendChild(port);\n\n setPortal(port);\n }\n\n return () => {\n port?.remove();\n\n setPortal(isSSR ? null : document.body);\n };\n }, [isSSR, parentRef]);\n\n return (\n <UNSAFE_PortalProvider getContainer={() => portal}>\n <AriaTooltip\n {...props}\n className={composeRenderProps(className, (className) =>\n TooltipStyles({ className }),\n )}\n offset={offset}\n placement={placement}\n >\n {children}\n </AriaTooltip>\n </UNSAFE_PortalProvider>\n );\n}\nTooltipBody.displayName = 'Tooltip.Body';\n\nTooltip.Trigger = TooltipTrigger;\nTooltip.Body = TooltipBody;\n"]}
1
+ {"version":3,"sources":["../../../src/components/tooltip/index.tsx"],"names":["children","ref","d","focusableProps","useFocusable","u","childRef","b","trigger","R","jsxs","cloneElement","mergeProps","y","mergeRefs","g","tooltip","TooltipTrigger","props","delay","C","jsx","AriaTooltipTrigger","l","E","TooltipFocusable","parentRef","className","placement","overlayContainer","useIsSSR","T","F","AriaTooltip","TooltipStyles","v","N","offset","Tooltip"],"mappings":"qjBA+CEA,EACA,SAEF,CAAA,CAA6D,CAC3DC,QAEA,CAAA,CAAA,CAAA,GAAQ,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAC,YAAA,CAAAC,CAAe,CAAA,CAAIC,KAAuB,CAAA,cACd,CAAA,CAAA,CAAQJ,CAAQK,YAAA,CAK9CC,CAAAA,CAEJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAAC,QAAA,CAAA,OAAkB,CAAA,CAAE,EAAI,CAAA,CAAA,MAAa,CAAMC,QAAc,CAAAC,OAAA,CAAA,EAElE,CAAA,CAAA,EAAA,CAAA,CACEC,CAAAA,GAAA,CACG,CAAA,CAAA,KAAA,CAAA,GAAAC,CAAaH,OACTI,IAAWT,SAAgBK,CAAAA,CAAQ,QAEtC,CAAA,CAAAK,YAAKC,CAAAA,CAAUR,CAAAA,CAAUL,GAC1Bc,UAAA,CACAC,CAAAA,CAAAA,CACH,CAEJ,KAqCA,CAAA,CAAA,GAASC,CAAAA,SAAe,CAAE,CAAA,CAAA,CAAA,CAAAhB,EAAK,CAAA,CAAA,CAAGiB,CAAM,CAAA,CAAwB,SAC/BA,CAAAA,CAAOjB,CAAAA,GAAO,CAAA,CAAA,CAAA,GAAoB,CAEjE,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,wBAAAD,IAAU,CAAA,CAAA,CAAAmB,CAAAA,KAAa,CAAA,QAE/B,CAAA,CAAA,CAAA,KAAsB,CACpB,CAAA,CAAA,GAAA,CAAA,GAAAnB,CAAAA,CACA,CAAA,CAAA,CAAA,OAAAoB,qBAAA,CAAA,CAAA,QAA8B,CAAA,CAAA,CAAA,2BACE,CAAG,YAInCC,CAACC,CAAAA,CAAA,CAAoB,KAAS,CAAA,CAAA,CAAA,GAAOH,CAAAA,CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAAI,GAAA,CAAAC,cAAAH,CAAAA,CAACI,GAAiB,CAAA,CAAA,KAAW,CAAA,CAAA,CAAA,QAAS,CACxCF,GAEJ,CACAN,CAAAA,CAAe,CAAA,GAAA,CAAA,CAAA,CAAA,QAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,6BAI3B,CAAA,SAAAS,CAAAA,CACA,CAAA,QAAA,CAAAC,CAAAA,CACA,SAAS,CAAA,CACT,CAAA,SAAAC,CAAAA,CAAY,CAAA,MAAA,CAAA,CACZ,CAAA,CAAA,CAAGV,SAGH,CAAMW,CAAAA,CADQC,QACmB,CAAO,GAAA,CAAA,CAAA,CAAA,CAAA,MAAS,CAAA,CAAAC,QAAA,EAAA,CAAA,IAAc,SAC/D,CAAA,aAAkB,CAAA,KAAA,CAAa,CAAA,OAAS,CAAA,EAAA,aAErC,OAAe,CAAA,UAAsB,CAAA,CAAQF,GAAAA,CAC5CG,cAAA,CAAA,CAAA,SAACC,CAAA,CACE,CAAA,MACD,CAAA,CAAA,CAAA,QAA8BN,CAAYA,GAAAA,CAAAA,OACxCO,CAAAA,CAAc,GAAE,CAAA,CAAA,SAClB,CAAAC,kBACA,CAAA,CAAA,CAAA,CAAA,EAAAC,aAAQC,CAAAA,CACR,SAAA,CAAWT,EAEV,CAAA,CAAA,CAAA,MAAA5B,CAAAA,CACH,CAAA,SAIE,CAAA,CAAA,CAAA,QAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAEtBsC,EAAQ,WAAUrB,CAAAA,SAAAA,CAAAA,CAAAA,CAAAA,OAAAA,CAAAA,CAAAA","file":"index.js","sourcesContent":["/*\n * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n'use client';\n\nimport 'client-only';\nimport {\n type FocusableProviderProps,\n useFocusable,\n} from '@react-aria/interactions';\nimport { useIsSSR } from '@react-aria/ssr';\nimport { mergeProps, mergeRefs, useObjectRef } from '@react-aria/utils';\nimport {\n Children,\n cloneElement,\n createContext,\n type DOMAttributes,\n type ReactElement,\n type ReactNode,\n type RefAttributes,\n version,\n} from 'react';\nimport {\n Tooltip as AriaTooltip,\n TooltipTrigger as AriaTooltipTrigger,\n type ContextValue,\n composeRenderProps,\n useContextProps,\n} from 'react-aria-components';\nimport { containsExactChildren } from '@/lib/react';\nimport { PortalProvider } from '@/providers/portal';\nimport { TooltipStyles } from './styles';\nimport type { FocusableElement } from '@react-types/shared';\nimport type { TooltipProps, TooltipTriggerProps } from './types';\n\nexport const TooltipContext =\n createContext<ContextValue<TooltipTriggerProps, HTMLDivElement>>(null);\n\nfunction TooltipFocusable({\n children,\n ref,\n ...props\n}: FocusableProviderProps & RefAttributes<FocusableElement>) {\n ref = useObjectRef(ref);\n\n const { focusableProps } = useFocusable(props, ref);\n const [trigger, tooltip] = Children.toArray(children) as [\n ReactElement<DOMAttributes<FocusableElement>, string>,\n ReactNode,\n ];\n\n const childRef =\n //@ts-expect-error\n Number.parseInt(version, 10) < 19 ? trigger.ref : trigger.props.ref;\n\n return (\n <>\n {cloneElement(trigger, {\n ...mergeProps(focusableProps, trigger.props),\n //@ts-expect-error\n ref: mergeRefs(childRef, ref),\n })}\n {tooltip}\n </>\n );\n}\n/**\n * Tooltip - A contextual popup component for providing additional information\n *\n * Displays helpful information when users hover over or focus on an element.\n * Provides accessible tooltip functionality with proper positioning, keyboard\n * navigation, and screen reader support for enhanced user experience.\n *\n * @example\n * // Basic tooltip\n * <Tooltip.Trigger>\n * <Button>Hover me</Button>\n * <Tooltip>\n * This is helpful information\n * </Tooltip>\n * </Tooltip.Trigger>\n *\n * @example\n * // Tooltip with custom positioning\n * <Tooltip.Trigger>\n * <Button>Hover for info</Button>\n * <Tooltip placement=\"top\" offset={10}>\n * Positioned above with custom offset\n * </Tooltip>\n * </Tooltip.Trigger>\n *\n * @example\n * // Icon with tooltip\n * <Tooltip.Trigger>\n * <Button variant=\"icon\">\n * <Icon><Info /></Icon>\n * </Button>\n * <Tooltip>\n * Additional context for this action\n * </Tooltip>\n * </Tooltip.Trigger>\n */\nfunction TooltipTrigger({ ref, ...props }: TooltipTriggerProps) {\n [props, ref] = useContextProps(props, ref ?? null, TooltipContext);\n\n const { children, delay = 250, ...rest } = props;\n\n containsExactChildren({\n children,\n componentName: TooltipTrigger.displayName,\n restrictions: [[Tooltip, { min: 1, max: 1 }]],\n });\n\n return (\n <AriaTooltipTrigger {...rest} delay={delay}>\n <TooltipFocusable ref={ref}>{children}</TooltipFocusable>\n </AriaTooltipTrigger>\n );\n}\nTooltipTrigger.displayName = 'Tooltip.Trigger';\n\nexport function Tooltip({\n children,\n parentRef,\n className,\n offset = 5,\n placement = 'bottom',\n ...props\n}: TooltipProps) {\n const isSSR = useIsSSR();\n const overlayContainer = isSSR ? null : document.createElement('div');\n overlayContainer?.setAttribute('class', 'absolute');\n return (\n <PortalProvider parentRef={parentRef} inject={overlayContainer}>\n <AriaTooltip\n {...props}\n className={composeRenderProps(className, (className) =>\n TooltipStyles({ className }),\n )}\n offset={offset}\n placement={placement}\n >\n {children}\n </AriaTooltip>\n </PortalProvider>\n );\n}\nTooltip.displayName = 'Tooltip';\n\nTooltip.Trigger = TooltipTrigger;\n"]}
@@ -1,10 +1,9 @@
1
- import { ComponentPropsWithRef, ComponentProps } from 'react';
2
- import { TooltipTriggerComponentProps, Focusable, TooltipProps as TooltipProps$1 } from 'react-aria-components';
1
+ import { ComponentPropsWithRef } from 'react';
2
+ import { TooltipProps as TooltipProps$1, TooltipTriggerComponentProps } from 'react-aria-components';
3
3
 
4
- type TooltipBodyProps = TooltipProps$1 & {
4
+ type TooltipTriggerProps = Omit<ComponentPropsWithRef<'div'>, 'className'> & TooltipTriggerComponentProps;
5
+ type TooltipProps = TooltipProps$1 & {
5
6
  parentRef?: React.RefObject<HTMLElement | null>;
6
7
  };
7
- type TooltipProps = Omit<ComponentPropsWithRef<'div'>, 'className'> & TooltipTriggerComponentProps;
8
- type TooltipTriggerProps = ComponentProps<typeof Focusable>;
9
8
 
10
- export type { TooltipBodyProps, TooltipProps, TooltipTriggerProps };
9
+ export type { TooltipProps, TooltipTriggerProps };
@@ -10,6 +10,27 @@ import '../../hooks/use-tree/types.js';
10
10
  import './styles.js';
11
11
 
12
12
  declare const TreeContext: react.Context<TreeContextValue>;
13
+ /**
14
+ * Tree - Hierarchical tree view with optional drag-and-drop and visibility
15
+ *
16
+ * Renders a selectable tree with support for nested items, drag-and-drop,
17
+ * selection modes, and visibility controls. Use Tree.Item to define nodes.
18
+ *
19
+ * @example
20
+ * <Tree items={items} expandedKeys={expandedKeys}>
21
+ * {(node) => <Node key={node.key} node={node} />}
22
+ * </Tree>
23
+ *
24
+ * @example
25
+ * <Tree>
26
+ * <Tree.Item id='one' textValue='one'>
27
+ * <Tree.Item.Content>One</Tree.Item.Content>
28
+ * <Tree.Item id='two' textValue='two'>
29
+ * <Tree.Item.Content>Two</Tree.Item.Content>
30
+ * </Tree.Item>
31
+ * </Tree.Item>
32
+ * </Tree>
33
+ */
13
34
  declare function Tree<T>({ children, className, disabledKeys: disabledKeysProp, dragAndDropConfig, expandedKeys: expandedKeysProp, items, selectedKeys: selectedKeysProp, showRuleLines, showVisibility, selectionMode, variant, visibleKeys: visibleKeysProp, onVisibilityChange, onSelectionChange, ...rest }: TreeProps<T>): react_jsx_runtime.JSX.Element;
14
35
  declare namespace Tree {
15
36
  var displayName: string;
@@ -48,4 +69,4 @@ declare namespace ItemActions {
48
69
  var displayName: string;
49
70
  }
50
71
 
51
- export { Tree, TreeContext, TreeItem, TreeItemContext };
72
+ export { Tree, TreeContext, TreeItemContext };
@@ -1,4 +1,4 @@
1
1
  'use client';
2
2
 
3
- import {jsx,jsxs}from'react/jsx-runtime';import {Show,Hide,ChevronDown,ChevronUp,DragVert}from'@accelint/icons';import {Cache}from'./../../hooks/use-tree/actions/cache.js';import'client-only';import {createContext,memo,useContext,useMemo}from'react';import {TreeItemContent,TreeItem,composeRenderProps,Text,useDragAndDrop,Tree,DropIndicator}from'react-aria-components';import {Button}from'../button/index.js';import {Checkbox}from'../checkbox/index.js';import {Icon}from'../icon/index.js';import {Lines}from'../lines/index.js';import {TreeStyles,TreeStylesDefaults}from'./styles.js';const {tree:pe,item:ue,content:ye,display:fe,icon:be,label:ve,actions:Te,spacing:E,description:he,drag:Ie,expansion:Ce,visibility:ge}=TreeStyles(),x=createContext({visibilityComputedKeys:new Set,showRuleLines:true,showVisibility:false,variant:TreeStylesDefaults.variant,isStatic:true,onVisibilityChange:()=>{}}),xe=t=>jsx(DropIndicator,{target:t,className:"border border-highlight-hover"}),we=memo(function({level:o,isLastOfSet:s}){const{showRuleLines:m,variant:r}=useContext(x);return Array.from({length:o}).map((i,n)=>{const a=n===o-1?"branch":"vert",d=s&&n>0?"last":a;return jsx(Lines,{variant:d,size:r==="crammed"?"medium":"large",isVisible:m,className:E({variant:r})},n)})});function H({children:t,className:o,disabledKeys:s,dragAndDropConfig:m,expandedKeys:r,items:i,selectedKeys:n,showRuleLines:a=true,showVisibility:d=true,selectionMode:l="multiple",variant:w=TreeStylesDefaults.variant,visibleKeys:y,onVisibilityChange:K,onSelectionChange:N,...D}){if(i&&(s||r||n||y))throw new Error("Tree should only be controlled with state from either `items` or keys props, not both");if(!!i!=(typeof t=="function"))throw new Error("Tree `items` and node iterator `children` must be used together");const{dragAndDropHooks:V}=useDragAndDrop({renderDropIndicator:xe,getAllowedDropOperations:()=>["move"],getDropOperation:()=>"move",...m}),f=useMemo(()=>i?new Cache([...i]):null,[i]),c=useMemo(()=>f?.getAllNodes(),[f]),{disabledKeys:S,expandedKeys:T,selectedKeys:h,visibleKeys:A,visibilityComputedKeys:I}=useMemo(()=>{const p={disabledKeys:c?new Set:s,expandedKeys:c?new Set:r,selectedKeys:c?new Set:n,visibleKeys:c?new Set:y,visibilityComputedKeys:new Set};return c?c.reduce((b,{key:C,isDisabled:G,isExpanded:J,isSelected:Q,isVisible:X,isVisibleComputed:Y})=>(G&&b.disabledKeys?.add(C),J&&b.expandedKeys?.add(C),Q&&b.selectedKeys?.add(C),X&&b.visibleKeys?.add(C),Y&&b.visibilityComputedKeys.add(C),b),p):p},[c,s,r,n,y]),F=h?p=>{p!=="all"&&N?.(p);}:void 0;return jsx(x.Provider,{value:{disabledKeys:S,expandedKeys:T,selectedKeys:h,showRuleLines:a,showVisibility:d,variant:w,visibleKeys:A,visibilityComputedKeys:I,isStatic:typeof t!="function",onVisibilityChange:K??(()=>{})},children:jsx(Tree,{...D,className:composeRenderProps(o,p=>pe({className:p,variant:w})),disabledKeys:S,dragAndDropHooks:V,expandedKeys:T,items:i,selectedKeys:h,onSelectionChange:F,selectionMode:l,children:t})})}H.displayName="Tree";const z=createContext({isVisible:true,isViewable:true,ancestors:[]});function u({className:t,id:o,...s}){const{visibilityComputedKeys:m,visibleKeys:r,isStatic:i}=useContext(x),{ancestors:n}=useContext(z),a=m?.has(o)||i&&n.every(l=>r?.has(l)),d=r?.has(o);return jsx(z.Provider,{value:{isVisible:d,isViewable:a,ancestors:[...n,o]},children:jsx(TreeItem,{...s,id:o,className:composeRenderProps(t,l=>ue({className:l})),"data-viewable":a||null,"data-visible":d||null})})}u.displayName="Tree.Item";function M({children:t}){const{showVisibility:o,variant:s,visibleKeys:m,onVisibilityChange:r}=useContext(x),{isVisible:i,isViewable:n}=useContext(z),a=s==="cozy"?"medium":"small";return jsx(TreeItemContent,{children:d=>{const{id:l,allowsDragging:w,hasChildItems:y,level:K,selectionBehavior:N,selectionMode:D,state:V,isDisabled:f,isExpanded:c,isSelected:S}=d,T=!(V.collection.getItem(l)?.nextKey||y),h=N==="toggle"&&D!=="none",A=()=>{const I=new Set(m);m?.has(l)?I.delete(l):I.add(l),r?.(I);};return jsx(Icon.Provider,{size:a,children:jsxs("div",{className:ye({variant:s}),"data-last-of-set":T,children:[o&&jsx(Button,{variant:"icon",color:"mono-bold",size:a,onPress:A,isDisabled:f,className:ge(),children:jsx(Icon,{children:i?jsx(Show,{}):jsx(Hide,{})})}),K>1&&jsx(we,{level:K,isLastOfSet:T}),y?jsx(Button,{slot:"chevron",variant:"icon",size:a,className:Ce(),children:jsx(Icon,{children:c?jsx(ChevronDown,{}):jsx(ChevronUp,{})})}):jsx("div",{className:E({variant:s})}),jsx("div",{className:fe({variant:s}),children:typeof t=="function"?t({...d,variant:s,isVisible:i,isViewable:n,defaultChildren:null}):t}),h&&jsx(Checkbox,{slot:"selection",isSelected:S,isDisabled:f}),w&&jsx(Button,{slot:"drag",variant:"icon",size:a,isDisabled:f,className:Ie({}),children:jsx(Icon,{children:jsx(DragVert,{})})})]})})}})}M.displayName="Tree.Item.Content";function W({children:t,className:o}){return jsx(Text,{className:ve({className:o}),children:t})}W.displayName="Tree.Item.Label";function U({children:t,className:o}){const{variant:s}=useContext(x);return s!=="crammed"?jsx(Text,{"data-slot":"description",className:he({className:o,variant:s}),children:t}):null}U.displayName="Tree.Item.Description";function _({children:t,className:o}){return jsx(Icon,{className:be({className:o}),children:t})}_.displayName="Tree.Item.PrefixIcon";function q({children:t,className:o}){return jsx("div",{className:Te({className:o}),children:t})}q.displayName="Tree.Icon.Actions",H.Item=u,u.Content=M,u.Label=W,u.Description=U,u.PrefixIcon=_,u.Actions=q;export{H as Tree,x as TreeContext,u as TreeItem,z as TreeItemContext};//# sourceMappingURL=index.js.map
3
+ import {jsx,jsxs}from'react/jsx-runtime';import {Show,Hide,ChevronDown,ChevronUp,DragVert}from'@accelint/icons';import {Cache}from'./../../hooks/use-tree/actions/cache.js';import'client-only';import {createContext,memo,useContext,useMemo}from'react';import {TreeItemContent,TreeItem,composeRenderProps,Text,useDragAndDrop,Tree,DropIndicator}from'react-aria-components';import {Button}from'../button/index.js';import {Checkbox}from'../checkbox/index.js';import {Icon}from'../icon/index.js';import {Lines}from'../lines/index.js';import {TreeStyles,TreeStylesDefaults}from'./styles.js';const {tree:pe,item:ue,content:ye,display:fe,icon:be,label:ve,actions:Te,spacing:E,description:he,drag:Ie,expansion:Ce,visibility:ge}=TreeStyles(),x=createContext({visibilityComputedKeys:new Set,showRuleLines:true,showVisibility:false,variant:TreeStylesDefaults.variant,isStatic:true,onVisibilityChange:()=>{}}),xe=t=>jsx(DropIndicator,{target:t,className:"border border-highlight-hover"}),we=memo(function({level:o,isLastOfSet:s}){const{showRuleLines:m,variant:r}=useContext(x);return Array.from({length:o}).map((i,n)=>{const a=n===o-1?"branch":"vert",d=s&&n>0?"last":a;return jsx(Lines,{variant:d,size:r==="crammed"?"medium":"large",isVisible:m,className:E({variant:r})},n)})});function H({children:t,className:o,disabledKeys:s,dragAndDropConfig:m,expandedKeys:r,items:i,selectedKeys:n,showRuleLines:a=true,showVisibility:d=true,selectionMode:l="multiple",variant:w=TreeStylesDefaults.variant,visibleKeys:y,onVisibilityChange:K,onSelectionChange:N,...D}){if(i&&(s||r||n||y))throw new Error("Tree should only be controlled with state from either `items` or keys props, not both");if(!!i!=(typeof t=="function"))throw new Error("Tree `items` and node iterator `children` must be used together");const{dragAndDropHooks:V}=useDragAndDrop({renderDropIndicator:xe,getAllowedDropOperations:()=>["move"],getDropOperation:()=>"move",...m}),f=useMemo(()=>i?new Cache([...i]):null,[i]),c=useMemo(()=>f?.getAllNodes(),[f]),{disabledKeys:S,expandedKeys:T,selectedKeys:h,visibleKeys:A,visibilityComputedKeys:I}=useMemo(()=>{const p={disabledKeys:c?new Set:s,expandedKeys:c?new Set:r,selectedKeys:c?new Set:n,visibleKeys:c?new Set:y,visibilityComputedKeys:new Set};return c?c.reduce((b,{key:C,isDisabled:G,isExpanded:J,isSelected:Q,isVisible:X,isVisibleComputed:Y})=>(G&&b.disabledKeys?.add(C),J&&b.expandedKeys?.add(C),Q&&b.selectedKeys?.add(C),X&&b.visibleKeys?.add(C),Y&&b.visibilityComputedKeys.add(C),b),p):p},[c,s,r,n,y]),F=h?p=>{p!=="all"&&N?.(p);}:void 0;return jsx(x.Provider,{value:{disabledKeys:S,expandedKeys:T,selectedKeys:h,showRuleLines:a,showVisibility:d,variant:w,visibleKeys:A,visibilityComputedKeys:I,isStatic:typeof t!="function",onVisibilityChange:K??(()=>{})},children:jsx(Tree,{...D,className:composeRenderProps(o,p=>pe({className:p,variant:w})),disabledKeys:S,dragAndDropHooks:V,expandedKeys:T,items:i,selectedKeys:h,onSelectionChange:F,selectionMode:l,children:t})})}H.displayName="Tree";const z=createContext({isVisible:true,isViewable:true,ancestors:[]});function u({className:t,id:o,...s}){const{visibilityComputedKeys:m,visibleKeys:r,isStatic:i}=useContext(x),{ancestors:n}=useContext(z),a=m?.has(o)||i&&n.every(l=>r?.has(l)),d=r?.has(o);return jsx(z.Provider,{value:{isVisible:d,isViewable:a,ancestors:[...n,o]},children:jsx(TreeItem,{...s,id:o,className:composeRenderProps(t,l=>ue({className:l})),"data-viewable":a||null,"data-visible":d||null})})}u.displayName="Tree.Item";function M({children:t}){const{showVisibility:o,variant:s,visibleKeys:m,onVisibilityChange:r}=useContext(x),{isVisible:i,isViewable:n}=useContext(z),a=s==="cozy"?"medium":"small";return jsx(TreeItemContent,{children:d=>{const{id:l,allowsDragging:w,hasChildItems:y,level:K,selectionBehavior:N,selectionMode:D,state:V,isDisabled:f,isExpanded:c,isSelected:S}=d,T=!(V.collection.getItem(l)?.nextKey||y),h=N==="toggle"&&D!=="none",A=()=>{const I=new Set(m);m?.has(l)?I.delete(l):I.add(l),r?.(I);};return jsx(Icon.Provider,{size:a,children:jsxs("div",{className:ye({variant:s}),"data-last-of-set":T,children:[o&&jsx(Button,{variant:"icon",color:"mono-bold",size:a,onPress:A,isDisabled:f,className:ge(),children:jsx(Icon,{children:i?jsx(Show,{}):jsx(Hide,{})})}),K>1&&jsx(we,{level:K,isLastOfSet:T}),y?jsx(Button,{slot:"chevron",variant:"icon",size:a,className:Ce(),children:jsx(Icon,{children:c?jsx(ChevronDown,{}):jsx(ChevronUp,{})})}):jsx("div",{className:E({variant:s})}),jsx("div",{className:fe({variant:s}),children:typeof t=="function"?t({...d,variant:s,isVisible:i,isViewable:n,defaultChildren:null}):t}),h&&jsx(Checkbox,{slot:"selection",isSelected:S,isDisabled:f}),w&&jsx(Button,{slot:"drag",variant:"icon",size:a,isDisabled:f,className:Ie({}),children:jsx(Icon,{children:jsx(DragVert,{})})})]})})}})}M.displayName="Tree.Item.Content";function W({children:t,className:o}){return jsx(Text,{className:ve({className:o}),children:t})}W.displayName="Tree.Item.Label";function U({children:t,className:o}){const{variant:s}=useContext(x);return s!=="crammed"?jsx(Text,{"data-slot":"description",className:he({className:o,variant:s}),children:t}):null}U.displayName="Tree.Item.Description";function _({children:t,className:o}){return jsx(Icon,{className:be({className:o}),children:t})}_.displayName="Tree.Item.PrefixIcon";function q({children:t,className:o}){return jsx("div",{className:Te({className:o}),children:t})}q.displayName="Tree.Icon.Actions",H.Item=u,u.Content=M,u.Label=W,u.Description=U,u.PrefixIcon=_,u.Actions=q;export{H as Tree,x as TreeContext,z as TreeItemContext};//# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/tree/index.tsx"],"names":["label","description","drag","expansion","TreeStyles","me","B","target","jsx","e","ae","TreeLines","se","showRuleLines","variant","TreeContext","_","i","type","level","Lines","ce","spacing","Tree","children","className","disabledKeysProp","selectionMode","onVisibilityChange","k","onSelectionChange","items","defaultRenderDropIndicator","le","nodes","P","oe","disabledKeys","visibilityComputedKeys","acc","selectedKeysProp","visibleKeysProp","isExpanded","isSelected","isDisabled","key","isVisible","isVisibleComputed","expandedKeysProp","handleSelectionChange","selectedKeys","AriaTree","ie","O","expandedKeys","TreeItem","visibleKeys","isStatic","isViewable","ancestors","v","id","TreeItemContext","rest","item","ne","useContext","renderProps","allowsDragging","re","state","isLastOfSet","hasChildItems","keys","size","jsxs","g","Ke","Button","handlePress","L","visibility","Hide","te","ee","ChevronUp","$","display","shouldShowSelection","j","ItemLabel","R","ItemDescription","ItemIcon","actions","ItemContent","ItemActions"],"mappings":"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","file":"index.js","sourcesContent":["/*\n * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n'use client';\n\nimport { ChevronDown, ChevronUp, DragVert, Hide, Show } from '@accelint/icons';\nimport { Cache } from '@/hooks/use-tree/actions/cache';\nimport type { Key, Selection } from '@react-types/shared';\nimport 'client-only';\nimport {\n createContext,\n memo,\n type PropsWithChildren,\n useContext,\n useMemo,\n} from 'react';\nimport {\n Tree as AriaTree,\n TreeItem as AriaTreeItem,\n TreeItemContent as AriaTreeItemContent,\n composeRenderProps,\n DropIndicator,\n type DropTarget,\n Text,\n type TextProps,\n useDragAndDrop,\n} from 'react-aria-components';\nimport { Button } from '../button';\nimport { Checkbox } from '../checkbox';\nimport { Icon } from '../icon';\nimport { Lines } from '../lines';\nimport { TreeStyles, TreeStylesDefaults } from './styles';\nimport type { IconProps } from '../icon/types';\nimport type {\n TreeContextValue,\n TreeItemContentProps,\n TreeItemContextValue,\n TreeItemProps,\n TreeProps,\n} from './types';\n\nconst {\n tree,\n item,\n content,\n display,\n icon,\n label,\n actions,\n spacing,\n description,\n drag,\n expansion,\n visibility,\n} = TreeStyles();\n\nexport const TreeContext = createContext<TreeContextValue>({\n visibilityComputedKeys: new Set(),\n showRuleLines: true,\n showVisibility: false,\n variant: TreeStylesDefaults.variant,\n isStatic: true,\n onVisibilityChange: () => undefined,\n});\n\nconst defaultRenderDropIndicator = (target: DropTarget) => (\n <DropIndicator target={target} className='border border-highlight-hover' />\n);\n\nconst TreeLines = memo(function TreeLines({\n level,\n isLastOfSet,\n}: {\n level: number;\n isLastOfSet: boolean;\n}) {\n const { showRuleLines, variant } = useContext(TreeContext);\n\n return Array.from({ length: level }).map((_, i) => {\n const type = i === level - 1 ? 'branch' : 'vert';\n const line = isLastOfSet && i > 0 ? 'last' : type;\n const size = variant === 'crammed' ? 'medium' : 'large';\n\n return (\n <Lines\n // biome-ignore lint/suspicious/noArrayIndexKey: index should be the key, only count matters\n key={i}\n variant={line}\n size={size}\n isVisible={showRuleLines}\n className={spacing({ variant })}\n />\n );\n });\n});\n\nexport function Tree<T>({\n children,\n className,\n disabledKeys: disabledKeysProp,\n dragAndDropConfig,\n expandedKeys: expandedKeysProp,\n items,\n selectedKeys: selectedKeysProp,\n showRuleLines = true,\n showVisibility = true,\n selectionMode = 'multiple',\n variant = TreeStylesDefaults.variant,\n visibleKeys: visibleKeysProp,\n onVisibilityChange,\n onSelectionChange,\n ...rest\n}: TreeProps<T>) {\n /**\n * A static collection is hard-coded. Dynamic is data-driven from an external source.\n * https://react-spectrum.adobe.com/react-aria/Tree.html#content\n *\n * Controlled state should only be used on a static tree.\n */\n if (\n items &&\n (disabledKeysProp ||\n expandedKeysProp ||\n selectedKeysProp ||\n visibleKeysProp)\n ) {\n throw new Error(\n 'Tree should only be controlled with state from either `items` or keys props, not both',\n );\n }\n\n /**\n * A static tree won't support the node iterator pattern.\n */\n if (!!items !== (typeof children === 'function')) {\n throw new Error(\n 'Tree `items` and node iterator `children` must be used together',\n );\n }\n\n const { dragAndDropHooks } = useDragAndDrop({\n renderDropIndicator: defaultRenderDropIndicator,\n getAllowedDropOperations: () => ['move'],\n getDropOperation: () => 'move',\n ...dragAndDropConfig,\n });\n const cache = useMemo(() => (items ? new Cache([...items]) : null), [items]);\n const nodes = useMemo(() => cache?.getAllNodes(), [cache]);\n const {\n disabledKeys,\n expandedKeys,\n selectedKeys,\n visibleKeys,\n visibilityComputedKeys,\n } = useMemo(() => {\n const acc = {\n disabledKeys: nodes ? new Set<Key>() : disabledKeysProp,\n expandedKeys: nodes ? new Set<Key>() : expandedKeysProp,\n selectedKeys: nodes ? new Set<Key>() : selectedKeysProp,\n visibleKeys: nodes ? new Set<Key>() : visibleKeysProp,\n visibilityComputedKeys: new Set<Key>(),\n };\n\n if (!nodes) {\n return acc;\n }\n\n return nodes.reduce(\n (\n acc,\n {\n key,\n isDisabled,\n isExpanded,\n isSelected,\n isVisible,\n isVisibleComputed,\n },\n ) => {\n if (isDisabled) {\n acc.disabledKeys?.add(key);\n }\n if (isExpanded) {\n acc.expandedKeys?.add(key);\n }\n if (isSelected) {\n acc.selectedKeys?.add(key);\n }\n if (isVisible) {\n acc.visibleKeys?.add(key);\n }\n if (isVisibleComputed) {\n acc.visibilityComputedKeys.add(key);\n }\n return acc;\n },\n acc,\n );\n }, [\n nodes,\n disabledKeysProp,\n expandedKeysProp,\n selectedKeysProp,\n visibleKeysProp,\n ]);\n\n const handleSelectionChange = selectedKeys\n ? (selection: Selection) => {\n if (selection !== 'all') {\n onSelectionChange?.(selection);\n }\n }\n : undefined;\n\n return (\n <TreeContext.Provider\n value={{\n disabledKeys,\n expandedKeys,\n selectedKeys,\n showRuleLines,\n showVisibility,\n variant,\n visibleKeys,\n visibilityComputedKeys,\n isStatic: typeof children !== 'function',\n onVisibilityChange: onVisibilityChange ?? (() => undefined), // TODO: improve\n }}\n >\n <AriaTree\n {...rest}\n className={composeRenderProps(className, (className) =>\n tree({ className, variant }),\n )}\n disabledKeys={disabledKeys}\n dragAndDropHooks={dragAndDropHooks}\n expandedKeys={expandedKeys}\n items={items}\n selectedKeys={selectedKeys}\n onSelectionChange={handleSelectionChange}\n selectionMode={selectionMode}\n >\n {children}\n </AriaTree>\n </TreeContext.Provider>\n );\n}\nTree.displayName = 'Tree';\n\nexport const TreeItemContext = createContext<TreeItemContextValue>({\n isVisible: true,\n isViewable: true,\n ancestors: [],\n});\n\nexport function TreeItem({ className, id, ...rest }: TreeItemProps) {\n const { visibilityComputedKeys, visibleKeys, isStatic } =\n useContext(TreeContext);\n const { ancestors } = useContext(TreeItemContext);\n const isViewable =\n visibilityComputedKeys?.has(id) ||\n (isStatic && ancestors.every((key) => visibleKeys?.has(key)));\n const isVisible = visibleKeys?.has(id);\n\n return (\n <TreeItemContext.Provider\n value={{\n isVisible,\n isViewable,\n ancestors: [...ancestors, id],\n }}\n >\n <AriaTreeItem\n {...rest}\n id={id}\n className={composeRenderProps(className, (className) =>\n item({ className }),\n )}\n data-viewable={isViewable || null}\n data-visible={isVisible || null}\n />\n </TreeItemContext.Provider>\n );\n}\nTreeItem.displayName = 'Tree.Item';\n\nfunction ItemContent({ children }: TreeItemContentProps) {\n const { showVisibility, variant, visibleKeys, onVisibilityChange } =\n useContext(TreeContext);\n const { isVisible, isViewable } = useContext(TreeItemContext);\n const size = variant === 'cozy' ? 'medium' : 'small';\n\n return (\n <AriaTreeItemContent>\n {(renderProps) => {\n const {\n id,\n allowsDragging,\n hasChildItems,\n level,\n selectionBehavior,\n selectionMode,\n state,\n isDisabled,\n isExpanded,\n isSelected,\n } = renderProps;\n\n const isLastOfSet = !(\n state.collection.getItem(id)?.nextKey || hasChildItems\n );\n const shouldShowSelection =\n selectionBehavior === 'toggle' && selectionMode !== 'none';\n\n const handlePress = () => {\n const keys = new Set<Key>(visibleKeys);\n visibleKeys?.has(id) ? keys.delete(id) : keys.add(id);\n onVisibilityChange?.(keys);\n };\n\n return (\n <Icon.Provider size={size}>\n <div\n className={content({ variant })}\n data-last-of-set={isLastOfSet}\n >\n {showVisibility && (\n <Button\n variant='icon'\n color='mono-bold'\n size={size}\n onPress={handlePress}\n isDisabled={isDisabled}\n className={visibility()}\n >\n <Icon>{isVisible ? <Show /> : <Hide />}</Icon>\n </Button>\n )}\n {level > 1 && (\n <TreeLines level={level} isLastOfSet={isLastOfSet} />\n )}\n {hasChildItems ? (\n <Button\n slot='chevron'\n variant='icon'\n size={size}\n className={expansion()}\n >\n <Icon>{isExpanded ? <ChevronDown /> : <ChevronUp />}</Icon>\n </Button>\n ) : (\n <div className={spacing({ variant })} />\n )}\n <div className={display({ variant })}>\n {typeof children === 'function'\n ? children({\n ...renderProps,\n variant,\n isVisible,\n isViewable: isViewable,\n defaultChildren: null,\n })\n : children}\n </div>\n {shouldShowSelection && (\n <Checkbox\n slot='selection'\n isSelected={isSelected}\n isDisabled={isDisabled}\n />\n )}\n {allowsDragging && (\n <Button\n slot='drag'\n variant='icon'\n size={size}\n isDisabled={isDisabled}\n className={drag({})}\n >\n <Icon>\n <DragVert />\n </Icon>\n </Button>\n )}\n </div>\n </Icon.Provider>\n );\n }}\n </AriaTreeItemContent>\n );\n}\nItemContent.displayName = 'Tree.Item.Content';\n\nfunction ItemLabel({ children, className }: TextProps) {\n return <Text className={label({ className })}>{children}</Text>;\n}\nItemLabel.displayName = 'Tree.Item.Label';\n\nfunction ItemDescription({ children, className }: TextProps) {\n const { variant } = useContext(TreeContext);\n\n return variant !== 'crammed' ? (\n <Text\n data-slot='description'\n className={description({ className, variant })}\n >\n {children}\n </Text>\n ) : null;\n}\nItemDescription.displayName = 'Tree.Item.Description';\n\nfunction ItemIcon({ children, className }: IconProps) {\n return <Icon className={icon({ className })}>{children}</Icon>;\n}\nItemIcon.displayName = 'Tree.Item.PrefixIcon';\n\nfunction ItemActions({\n children,\n className,\n}: PropsWithChildren & { className?: string }) {\n return <div className={actions({ className })}>{children}</div>;\n}\nItemActions.displayName = 'Tree.Icon.Actions';\n\nTree.Item = TreeItem;\nTreeItem.Content = ItemContent;\nTreeItem.Label = ItemLabel;\nTreeItem.Description = ItemDescription;\nTreeItem.PrefixIcon = ItemIcon;\nTreeItem.Actions = ItemActions;\n"]}
1
+ {"version":3,"sources":["../../../src/components/tree/index.tsx"],"names":["label","description","drag","expansion","TreeStyles","me","B","target","jsx","e","ae","TreeLines","se","showRuleLines","variant","TreeContext","_","i","type","level","Lines","ce","spacing","Tree","children","className","disabledKeysProp","selectionMode","onVisibilityChange","k","onSelectionChange","items","defaultRenderDropIndicator","le","nodes","P","oe","disabledKeys","visibilityComputedKeys","acc","selectedKeysProp","visibleKeysProp","isExpanded","isSelected","isDisabled","key","isVisible","isVisibleComputed","expandedKeysProp","handleSelectionChange","selectedKeys","AriaTree","ie","O","expandedKeys","TreeItem","visibleKeys","isStatic","isViewable","ancestors","v","id","TreeItemContext","rest","item","ne","useContext","renderProps","allowsDragging","re","state","isLastOfSet","hasChildItems","keys","size","jsxs","g","Ke","Button","handlePress","L","visibility","Hide","te","ee","ChevronUp","$","display","shouldShowSelection","j","ItemLabel","R","ItemDescription","ItemIcon","actions","ItemContent","ItemActions"],"mappings":"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","file":"index.js","sourcesContent":["/*\n * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n'use client';\n\nimport { ChevronDown, ChevronUp, DragVert, Hide, Show } from '@accelint/icons';\nimport { Cache } from '@/hooks/use-tree/actions/cache';\nimport type { Key, Selection } from '@react-types/shared';\nimport 'client-only';\nimport {\n createContext,\n memo,\n type PropsWithChildren,\n useContext,\n useMemo,\n} from 'react';\nimport {\n Tree as AriaTree,\n TreeItem as AriaTreeItem,\n TreeItemContent as AriaTreeItemContent,\n composeRenderProps,\n DropIndicator,\n type DropTarget,\n Text,\n type TextProps,\n useDragAndDrop,\n} from 'react-aria-components';\nimport { Button } from '../button';\nimport { Checkbox } from '../checkbox';\nimport { Icon } from '../icon';\nimport { Lines } from '../lines';\nimport { TreeStyles, TreeStylesDefaults } from './styles';\nimport type { IconProps } from '../icon/types';\nimport type {\n TreeContextValue,\n TreeItemContentProps,\n TreeItemContextValue,\n TreeItemProps,\n TreeProps,\n} from './types';\n\nconst {\n tree,\n item,\n content,\n display,\n icon,\n label,\n actions,\n spacing,\n description,\n drag,\n expansion,\n visibility,\n} = TreeStyles();\n\nexport const TreeContext = createContext<TreeContextValue>({\n visibilityComputedKeys: new Set(),\n showRuleLines: true,\n showVisibility: false,\n variant: TreeStylesDefaults.variant,\n isStatic: true,\n onVisibilityChange: () => undefined,\n});\n\nconst defaultRenderDropIndicator = (target: DropTarget) => (\n <DropIndicator target={target} className='border border-highlight-hover' />\n);\n\nconst TreeLines = memo(function TreeLines({\n level,\n isLastOfSet,\n}: {\n level: number;\n isLastOfSet: boolean;\n}) {\n const { showRuleLines, variant } = useContext(TreeContext);\n\n return Array.from({ length: level }).map((_, i) => {\n const type = i === level - 1 ? 'branch' : 'vert';\n const line = isLastOfSet && i > 0 ? 'last' : type;\n const size = variant === 'crammed' ? 'medium' : 'large';\n\n return (\n <Lines\n // biome-ignore lint/suspicious/noArrayIndexKey: index should be the key, only count matters\n key={i}\n variant={line}\n size={size}\n isVisible={showRuleLines}\n className={spacing({ variant })}\n />\n );\n });\n});\n\n/**\n * Tree - Hierarchical tree view with optional drag-and-drop and visibility\n *\n * Renders a selectable tree with support for nested items, drag-and-drop,\n * selection modes, and visibility controls. Use Tree.Item to define nodes.\n *\n * @example\n * <Tree items={items} expandedKeys={expandedKeys}>\n * {(node) => <Node key={node.key} node={node} />}\n * </Tree>\n *\n * @example\n * <Tree>\n * <Tree.Item id='one' textValue='one'>\n * <Tree.Item.Content>One</Tree.Item.Content>\n * <Tree.Item id='two' textValue='two'>\n * <Tree.Item.Content>Two</Tree.Item.Content>\n * </Tree.Item>\n * </Tree.Item>\n * </Tree>\n */\nexport function Tree<T>({\n children,\n className,\n disabledKeys: disabledKeysProp,\n dragAndDropConfig,\n expandedKeys: expandedKeysProp,\n items,\n selectedKeys: selectedKeysProp,\n showRuleLines = true,\n showVisibility = true,\n selectionMode = 'multiple',\n variant = TreeStylesDefaults.variant,\n visibleKeys: visibleKeysProp,\n onVisibilityChange,\n onSelectionChange,\n ...rest\n}: TreeProps<T>) {\n /**\n * A static collection is hard-coded. Dynamic is data-driven from an external source.\n * https://react-spectrum.adobe.com/react-aria/Tree.html#content\n *\n * Controlled state should only be used on a static tree.\n */\n if (\n items &&\n (disabledKeysProp ||\n expandedKeysProp ||\n selectedKeysProp ||\n visibleKeysProp)\n ) {\n throw new Error(\n 'Tree should only be controlled with state from either `items` or keys props, not both',\n );\n }\n\n /**\n * A static tree won't support the node iterator pattern.\n */\n if (!!items !== (typeof children === 'function')) {\n throw new Error(\n 'Tree `items` and node iterator `children` must be used together',\n );\n }\n\n const { dragAndDropHooks } = useDragAndDrop({\n renderDropIndicator: defaultRenderDropIndicator,\n getAllowedDropOperations: () => ['move'],\n getDropOperation: () => 'move',\n ...dragAndDropConfig,\n });\n const cache = useMemo(() => (items ? new Cache([...items]) : null), [items]);\n const nodes = useMemo(() => cache?.getAllNodes(), [cache]);\n const {\n disabledKeys,\n expandedKeys,\n selectedKeys,\n visibleKeys,\n visibilityComputedKeys,\n } = useMemo(() => {\n const acc = {\n disabledKeys: nodes ? new Set<Key>() : disabledKeysProp,\n expandedKeys: nodes ? new Set<Key>() : expandedKeysProp,\n selectedKeys: nodes ? new Set<Key>() : selectedKeysProp,\n visibleKeys: nodes ? new Set<Key>() : visibleKeysProp,\n visibilityComputedKeys: new Set<Key>(),\n };\n\n if (!nodes) {\n return acc;\n }\n\n return nodes.reduce(\n (\n acc,\n {\n key,\n isDisabled,\n isExpanded,\n isSelected,\n isVisible,\n isVisibleComputed,\n },\n ) => {\n if (isDisabled) {\n acc.disabledKeys?.add(key);\n }\n if (isExpanded) {\n acc.expandedKeys?.add(key);\n }\n if (isSelected) {\n acc.selectedKeys?.add(key);\n }\n if (isVisible) {\n acc.visibleKeys?.add(key);\n }\n if (isVisibleComputed) {\n acc.visibilityComputedKeys.add(key);\n }\n return acc;\n },\n acc,\n );\n }, [\n nodes,\n disabledKeysProp,\n expandedKeysProp,\n selectedKeysProp,\n visibleKeysProp,\n ]);\n\n const handleSelectionChange = selectedKeys\n ? (selection: Selection) => {\n if (selection !== 'all') {\n onSelectionChange?.(selection);\n }\n }\n : undefined;\n\n return (\n <TreeContext.Provider\n value={{\n disabledKeys,\n expandedKeys,\n selectedKeys,\n showRuleLines,\n showVisibility,\n variant,\n visibleKeys,\n visibilityComputedKeys,\n isStatic: typeof children !== 'function',\n onVisibilityChange: onVisibilityChange ?? (() => undefined), // TODO: improve\n }}\n >\n <AriaTree\n {...rest}\n className={composeRenderProps(className, (className) =>\n tree({ className, variant }),\n )}\n disabledKeys={disabledKeys}\n dragAndDropHooks={dragAndDropHooks}\n expandedKeys={expandedKeys}\n items={items}\n selectedKeys={selectedKeys}\n onSelectionChange={handleSelectionChange}\n selectionMode={selectionMode}\n >\n {children}\n </AriaTree>\n </TreeContext.Provider>\n );\n}\nTree.displayName = 'Tree';\n\nexport const TreeItemContext = createContext<TreeItemContextValue>({\n isVisible: true,\n isViewable: true,\n ancestors: [],\n});\n\nfunction TreeItem({ className, id, ...rest }: TreeItemProps) {\n const { visibilityComputedKeys, visibleKeys, isStatic } =\n useContext(TreeContext);\n const { ancestors } = useContext(TreeItemContext);\n const isViewable =\n visibilityComputedKeys?.has(id) ||\n (isStatic && ancestors.every((key) => visibleKeys?.has(key)));\n const isVisible = visibleKeys?.has(id);\n\n return (\n <TreeItemContext.Provider\n value={{\n isVisible,\n isViewable,\n ancestors: [...ancestors, id],\n }}\n >\n <AriaTreeItem\n {...rest}\n id={id}\n className={composeRenderProps(className, (className) =>\n item({ className }),\n )}\n data-viewable={isViewable || null}\n data-visible={isVisible || null}\n />\n </TreeItemContext.Provider>\n );\n}\nTreeItem.displayName = 'Tree.Item';\n\nfunction ItemContent({ children }: TreeItemContentProps) {\n const { showVisibility, variant, visibleKeys, onVisibilityChange } =\n useContext(TreeContext);\n const { isVisible, isViewable } = useContext(TreeItemContext);\n const size = variant === 'cozy' ? 'medium' : 'small';\n\n return (\n <AriaTreeItemContent>\n {(renderProps) => {\n const {\n id,\n allowsDragging,\n hasChildItems,\n level,\n selectionBehavior,\n selectionMode,\n state,\n isDisabled,\n isExpanded,\n isSelected,\n } = renderProps;\n\n const isLastOfSet = !(\n state.collection.getItem(id)?.nextKey || hasChildItems\n );\n const shouldShowSelection =\n selectionBehavior === 'toggle' && selectionMode !== 'none';\n\n const handlePress = () => {\n const keys = new Set<Key>(visibleKeys);\n visibleKeys?.has(id) ? keys.delete(id) : keys.add(id);\n onVisibilityChange?.(keys);\n };\n\n return (\n <Icon.Provider size={size}>\n <div\n className={content({ variant })}\n data-last-of-set={isLastOfSet}\n >\n {showVisibility && (\n <Button\n variant='icon'\n color='mono-bold'\n size={size}\n onPress={handlePress}\n isDisabled={isDisabled}\n className={visibility()}\n >\n <Icon>{isVisible ? <Show /> : <Hide />}</Icon>\n </Button>\n )}\n {level > 1 && (\n <TreeLines level={level} isLastOfSet={isLastOfSet} />\n )}\n {hasChildItems ? (\n <Button\n slot='chevron'\n variant='icon'\n size={size}\n className={expansion()}\n >\n <Icon>{isExpanded ? <ChevronDown /> : <ChevronUp />}</Icon>\n </Button>\n ) : (\n <div className={spacing({ variant })} />\n )}\n <div className={display({ variant })}>\n {typeof children === 'function'\n ? children({\n ...renderProps,\n variant,\n isVisible,\n isViewable: isViewable,\n defaultChildren: null,\n })\n : children}\n </div>\n {shouldShowSelection && (\n <Checkbox\n slot='selection'\n isSelected={isSelected}\n isDisabled={isDisabled}\n />\n )}\n {allowsDragging && (\n <Button\n slot='drag'\n variant='icon'\n size={size}\n isDisabled={isDisabled}\n className={drag({})}\n >\n <Icon>\n <DragVert />\n </Icon>\n </Button>\n )}\n </div>\n </Icon.Provider>\n );\n }}\n </AriaTreeItemContent>\n );\n}\nItemContent.displayName = 'Tree.Item.Content';\n\nfunction ItemLabel({ children, className }: TextProps) {\n return <Text className={label({ className })}>{children}</Text>;\n}\nItemLabel.displayName = 'Tree.Item.Label';\n\nfunction ItemDescription({ children, className }: TextProps) {\n const { variant } = useContext(TreeContext);\n\n return variant !== 'crammed' ? (\n <Text\n data-slot='description'\n className={description({ className, variant })}\n >\n {children}\n </Text>\n ) : null;\n}\nItemDescription.displayName = 'Tree.Item.Description';\n\nfunction ItemIcon({ children, className }: IconProps) {\n return <Icon className={icon({ className })}>{children}</Icon>;\n}\nItemIcon.displayName = 'Tree.Item.PrefixIcon';\n\nfunction ItemActions({\n children,\n className,\n}: PropsWithChildren & { className?: string }) {\n return <div className={actions({ className })}>{children}</div>;\n}\nItemActions.displayName = 'Tree.Icon.Actions';\n\nTree.Item = TreeItem;\nTreeItem.Content = ItemContent;\nTreeItem.Label = ItemLabel;\nTreeItem.Description = ItemDescription;\nTreeItem.PrefixIcon = ItemIcon;\nTreeItem.Actions = ItemActions;\n"]}
@@ -1,2 +1,2 @@
1
- import {tv}from'./../../lib/utils.js';const t={variant:"cozy"},a=tv({slots:{tree:"overflow-auto outline-hidden",item:["not-visible:fg-primary-muted not-viewable:fg-primary-muted fg-primary-bold px-s","group/tree-item rounded-medium hover:bg-interactive-muted-hover","drop-target:border drop-target:bg-accent-primary-muted/20 drop-target:outline-accent-primary-bold","disabled:cursor-not-allowed disabled:border-none disabled:hover:bg-transparent disabled:data-[drop-target=true]:bg-transparent"],content:["flex items-center justify-items-start px-xs","overflow-x group w-full outline-hidden"],display:'grid flex-1 grid-cols-[auto_auto_1fr_auto] items-center [grid-template-areas:"icon_label_space_action"_"icon_description_space_action"]',icon:"[grid-area:icon]",label:"not-has-[+[data-slot=description]]:row-span-full [grid-area:label]",description:"fg-primary-muted text-body-s [grid-area:description]",actions:"flex shrink-0 items-center [grid-area:action]",spacing:"",visibility:["group-not-visible/tree-item:enabled:color-mono-bold:fg-primary-muted","group-not-viewable/tree-item:enabled:color-mono-bold:fg-primary-muted fg-primary-bold","fg-primary-bold"],expansion:["group-not-visible/tree-item:enabled:color-mono-bold:fg-primary-muted","group-not-viewable/tree-item:enabled:color-mono-bold:fg-primary-muted fg-primary-bold","fg-primary-bold"],drag:["group-not-visible/tree-item:enabled:color-mono-bold:fg-primary-muted","group-not-viewable/tree-item:enabled:color-mono-bold:fg-primary-muted fg-primary-bold","fg-primary-bold"]},variants:{variant:{cozy:{content:"min-h-[48px] text-header-m",display:"gap-x-s px-xs",label:"gap-xs",actions:"gap-x-xs",spacing:"min-h-[46px] w-[28px]",item:"min-h-s"},compact:{content:"min-h-[36px] gap-xs text-header-s",display:"gap-x-s px-xxs",label:"gap-xs",actions:"gap-x-xxs",spacing:"min-h-[38px] w-[20px]",item:"min-h-l"},crammed:{content:"gap-xs text-header-s",display:"gap-x-xs px-xxs",label:"gap-xs",actions:"gap-x-xxs",spacing:"min-h-xl w-[20px]",item:"min-h-s"}}},defaultVariants:t});export{a as TreeStyles,t as TreeStylesDefaults};//# sourceMappingURL=styles.js.map
1
+ import {tv}from'./../../lib/utils.js';const t={variant:"cozy"},a=tv({slots:{tree:"overflow-auto outline-hidden",item:["not-visible:fg-primary-muted not-viewable:fg-primary-muted fg-primary-bold px-s","group/tree-item\xB7rounded-medium\xB7pressed:bg-interactive-muted-pressed\xB7hover:bg-interactive-muted-hover\xB7focus-visible:bg-interactive-muted-hover","drop-target:border drop-target:bg-accent-primary-muted/20 drop-target:outline-accent-primary-bold","disabled:cursor-not-allowed disabled:border-none disabled:hover:bg-transparent disabled:data-[drop-target=true]:bg-transparent"],content:["flex items-center justify-items-start px-xs","overflow-x group w-full outline-hidden"],display:'grid flex-1 grid-cols-[auto_auto_1fr_auto] items-center [grid-template-areas:"icon_label_space_action"_"icon_description_space_action"]',icon:"[grid-area:icon]",label:"not-has-[+[data-slot=description]]:row-span-full [grid-area:label]",description:"fg-primary-muted text-body-s [grid-area:description]",actions:"flex shrink-0 items-center [grid-area:action]",spacing:"",visibility:["group-not-visible/tree-item:enabled:color-mono-bold:fg-primary-muted","group-not-viewable/tree-item:enabled:color-mono-bold:fg-primary-muted fg-primary-bold","fg-primary-bold"],expansion:["group-not-visible/tree-item:enabled:color-mono-bold:fg-primary-muted","group-not-viewable/tree-item:enabled:color-mono-bold:fg-primary-muted fg-primary-bold","fg-primary-bold"],drag:["group-not-visible/tree-item:enabled:color-mono-bold:fg-primary-muted","group-not-viewable/tree-item:enabled:color-mono-bold:fg-primary-muted fg-primary-bold","fg-primary-bold"]},variants:{variant:{cozy:{content:"min-h-[48px] text-header-m",display:"gap-x-s px-xs",label:"gap-xs",actions:"gap-x-xs",spacing:"min-h-[46px] w-[28px]",item:"min-h-s"},compact:{content:"min-h-[36px] gap-xs text-header-s",display:"gap-x-s px-xxs",label:"gap-xs",actions:"gap-x-xxs",spacing:"min-h-[38px] w-[20px]",item:"min-h-l"},crammed:{content:"gap-xs text-header-s",display:"gap-x-xs px-xxs",label:"gap-xs",actions:"gap-x-xxs",spacing:"min-h-xl w-[20px]",item:"min-h-s"}}},defaultVariants:t});export{a as TreeStyles,t as TreeStylesDefaults};//# sourceMappingURL=styles.js.map
2
2
  //# sourceMappingURL=styles.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/tree/styles.ts"],"names":["TreeStyles","tv","e"],"mappings":"sCAeE,MAAA,CAAS,CAAA,CAAA,OAGEA,CAAaC,SACjB,CACLC,EAAA,CAAA,CAAA,KAAM,CAAA,CAAA,IAAA,CAAA,8BAEJ,CAAA,IAAA,CAAA,CAAA,iFACA,CAAA,iEACA,CAAA,mGACA,CAAA,gIAEO,CACP,CAAA,OAAA,CAAA,CAAA,6CACA,CAAA,wCAGA,CAAA,CAAA,OAAA,CAAA,yIACI,CAAA,IAAA,CAAA,kBACC,CAAA,KAAA,CAAA,gFACM,CAAA,sDACJ,CAAA,OAAA,CAAA,+CACA,CAAA,OACT,CAAA,EAAA,CAAA,UACE,CAAA,CAAA,sEACA,CAAA,uFACA,CAAA,iBAEF,CAAA,CAAW,SACT,CAAA,CAAA,sEACA,CAAA,uFACA,CAAA,iBAGA,CAAA,CAAA,IAAA,CAAA,CAAA,sEACA,CAAA,yGAIJ,CAAA,CAAU,CACR,QAAS,CACP,QACE,CAAA,CAAA,IAAS,CAAA,CAAA,OAAA,CAAA,4BACA,CAAA,OAAA,CAAA,qBAET,CAAA,QAAS,CAAA,OAAA,CAAA,UACA,CAAA,OAAA,CAAA,uBACH,CAAA,IACR,CAAA,SACS,CACP,CAAA,OAAS,CAAA,CAAA,OAAA,CAAA,mCACA,CAAA,OAAA,CAAA,sBAET,CAAA,QAAS,CAAA,OAAA,CAAA,WACA,CAAA,OAAA,CAAA,uBACH,CAAA,IACR,UACS,CACP,CAAA,OAAS,CAAA,CAAA,OAAA,CAAA,sBACA,CAAA,OAAA,CAAA,iBACF,CAAA,KACP,CAAA,QAAS,CAAA,OAAA,CAAA,WACA,CAAA,OAAA,CAAA,mBACH,CAAA,IACR,CACF,SAEF,CAAA,CAAA,CAAA,CAAA,eACD,CAAA,CAAA,CAAA","file":"styles.js","sourcesContent":["/*\n * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { tv } from '@/lib/utils';\n\nexport const TreeStylesDefaults = {\n variant: 'cozy',\n} as const;\n\nexport const TreeStyles = tv({\n slots: {\n tree: 'overflow-auto outline-hidden',\n item: [\n 'not-visible:fg-primary-muted not-viewable:fg-primary-muted fg-primary-bold px-s',\n 'group/tree-item rounded-medium hover:bg-interactive-muted-hover',\n 'drop-target:border drop-target:bg-accent-primary-muted/20 drop-target:outline-accent-primary-bold',\n 'disabled:cursor-not-allowed disabled:border-none disabled:hover:bg-transparent disabled:data-[drop-target=true]:bg-transparent',\n ],\n content: [\n 'flex items-center justify-items-start px-xs',\n 'overflow-x group w-full outline-hidden',\n ],\n display:\n 'grid flex-1 grid-cols-[auto_auto_1fr_auto] items-center [grid-template-areas:\"icon_label_space_action\"_\"icon_description_space_action\"]',\n icon: '[grid-area:icon]',\n label: 'not-has-[+[data-slot=description]]:row-span-full [grid-area:label]',\n description: 'fg-primary-muted text-body-s [grid-area:description]',\n actions: 'flex shrink-0 items-center [grid-area:action]',\n spacing: '',\n visibility: [\n 'group-not-visible/tree-item:enabled:color-mono-bold:fg-primary-muted',\n 'group-not-viewable/tree-item:enabled:color-mono-bold:fg-primary-muted fg-primary-bold',\n 'fg-primary-bold',\n ],\n expansion: [\n 'group-not-visible/tree-item:enabled:color-mono-bold:fg-primary-muted',\n 'group-not-viewable/tree-item:enabled:color-mono-bold:fg-primary-muted fg-primary-bold',\n 'fg-primary-bold',\n ],\n drag: [\n 'group-not-visible/tree-item:enabled:color-mono-bold:fg-primary-muted',\n 'group-not-viewable/tree-item:enabled:color-mono-bold:fg-primary-muted fg-primary-bold',\n 'fg-primary-bold',\n ],\n },\n variants: {\n variant: {\n cozy: {\n content: 'min-h-[48px] text-header-m',\n display: 'gap-x-s px-xs',\n label: 'gap-xs',\n actions: 'gap-x-xs',\n spacing: 'min-h-[46px] w-[28px]',\n item: 'min-h-s',\n },\n compact: {\n content: 'min-h-[36px] gap-xs text-header-s',\n display: 'gap-x-s px-xxs',\n label: 'gap-xs',\n actions: 'gap-x-xxs',\n spacing: 'min-h-[38px] w-[20px]',\n item: 'min-h-l',\n },\n crammed: {\n content: 'gap-xs text-header-s',\n display: 'gap-x-xs px-xxs',\n label: 'gap-xs',\n actions: 'gap-x-xxs',\n spacing: 'min-h-xl w-[20px]',\n item: 'min-h-s',\n },\n },\n },\n defaultVariants: TreeStylesDefaults,\n});\n"]}
1
+ {"version":3,"sources":["../../../src/components/tree/styles.ts"],"names":["TreeStyles","tv","e"],"mappings":"sCAeE,MAAA,CAAS,CAAA,CAAA,OAGEA,CAAaC,SACjB,CACLC,EAAA,CAAA,CAAA,KAAM,CAAA,CAAA,IAAA,CAAA,8BAEJ,CAAA,IAAA,CAAA,CAAA,iFACA,CAAA,2JACA,CAAA,mGACA,CAAA,gIAEO,CACP,CAAA,OAAA,CAAA,CAAA,6CACA,CAAA,wCAGA,CAAA,CAAA,OAAA,CAAA,yIACI,CAAA,IAAA,CAAA,kBACC,CAAA,KAAA,CAAA,gFACM,CAAA,sDACJ,CAAA,OAAA,CAAA,+CACA,CAAA,OACT,CAAA,EAAA,CAAA,UACE,CAAA,CAAA,sEACA,CAAA,uFACA,CAAA,iBAEF,CAAA,CAAW,SACT,CAAA,CAAA,sEACA,CAAA,uFACA,CAAA,iBAGA,CAAA,CAAA,IAAA,CAAA,CAAA,sEACA,CAAA,yGAIJ,CAAA,CAAU,CACR,QAAS,CACP,QACE,CAAA,CAAA,IAAS,CAAA,CAAA,OAAA,CAAA,4BACA,CAAA,OAAA,CAAA,qBAET,CAAA,QAAS,CAAA,OAAA,CAAA,UACA,CAAA,OAAA,CAAA,uBACH,CAAA,IACR,CAAA,SACS,CACP,CAAA,OAAS,CAAA,CAAA,OAAA,CAAA,mCACA,CAAA,OAAA,CAAA,sBAET,CAAA,QAAS,CAAA,OAAA,CAAA,WACA,CAAA,OAAA,CAAA,uBACH,CAAA,IACR,UACS,CACP,CAAA,OAAS,CAAA,CAAA,OAAA,CAAA,sBACA,CAAA,OAAA,CAAA,iBACF,CAAA,KACP,CAAA,QAAS,CAAA,OAAA,CAAA,WACA,CAAA,OAAA,CAAA,mBACH,CAAA,IACR,CACF,SAEF,CAAA,CAAA,CAAA,CAAA,eACD,CAAA,CAAA,CAAA","file":"styles.js","sourcesContent":["/*\n * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { tv } from '@/lib/utils';\n\nexport const TreeStylesDefaults = {\n variant: 'cozy',\n} as const;\n\nexport const TreeStyles = tv({\n slots: {\n tree: 'overflow-auto outline-hidden',\n item: [\n 'not-visible:fg-primary-muted not-viewable:fg-primary-muted fg-primary-bold px-s',\n 'group/tree-item·rounded-medium·pressed:bg-interactive-muted-pressed·hover:bg-interactive-muted-hover·focus-visible:bg-interactive-muted-hover',\n 'drop-target:border drop-target:bg-accent-primary-muted/20 drop-target:outline-accent-primary-bold',\n 'disabled:cursor-not-allowed disabled:border-none disabled:hover:bg-transparent disabled:data-[drop-target=true]:bg-transparent',\n ],\n content: [\n 'flex items-center justify-items-start px-xs',\n 'overflow-x group w-full outline-hidden',\n ],\n display:\n 'grid flex-1 grid-cols-[auto_auto_1fr_auto] items-center [grid-template-areas:\"icon_label_space_action\"_\"icon_description_space_action\"]',\n icon: '[grid-area:icon]',\n label: 'not-has-[+[data-slot=description]]:row-span-full [grid-area:label]',\n description: 'fg-primary-muted text-body-s [grid-area:description]',\n actions: 'flex shrink-0 items-center [grid-area:action]',\n spacing: '',\n visibility: [\n 'group-not-visible/tree-item:enabled:color-mono-bold:fg-primary-muted',\n 'group-not-viewable/tree-item:enabled:color-mono-bold:fg-primary-muted fg-primary-bold',\n 'fg-primary-bold',\n ],\n expansion: [\n 'group-not-visible/tree-item:enabled:color-mono-bold:fg-primary-muted',\n 'group-not-viewable/tree-item:enabled:color-mono-bold:fg-primary-muted fg-primary-bold',\n 'fg-primary-bold',\n ],\n drag: [\n 'group-not-visible/tree-item:enabled:color-mono-bold:fg-primary-muted',\n 'group-not-viewable/tree-item:enabled:color-mono-bold:fg-primary-muted fg-primary-bold',\n 'fg-primary-bold',\n ],\n },\n variants: {\n variant: {\n cozy: {\n content: 'min-h-[48px] text-header-m',\n display: 'gap-x-s px-xs',\n label: 'gap-xs',\n actions: 'gap-x-xs',\n spacing: 'min-h-[46px] w-[28px]',\n item: 'min-h-s',\n },\n compact: {\n content: 'min-h-[36px] gap-xs text-header-s',\n display: 'gap-x-s px-xxs',\n label: 'gap-xs',\n actions: 'gap-x-xxs',\n spacing: 'min-h-[38px] w-[20px]',\n item: 'min-h-l',\n },\n crammed: {\n content: 'gap-xs text-header-s',\n display: 'gap-x-xs px-xxs',\n label: 'gap-xs',\n actions: 'gap-x-xxs',\n spacing: 'min-h-xl w-[20px]',\n item: 'min-h-s',\n },\n },\n },\n defaultVariants: TreeStylesDefaults,\n});\n"]}
@@ -13,14 +13,54 @@ declare const ViewStackEventHandlers: {
13
13
  readonly push: (view: UniqueId) => void;
14
14
  readonly reset: (stack: UniqueId) => void;
15
15
  };
16
+ declare function useViewStackEmit(): {
17
+ readonly back: (stack: UniqueId) => void;
18
+ readonly clear: (stack: UniqueId) => void;
19
+ readonly push: (view: UniqueId) => void;
20
+ readonly reset: (stack: UniqueId) => void;
21
+ };
16
22
  declare function ViewStackTrigger({ children, for: types }: ViewStackTriggerProps): react_jsx_runtime.JSX.Element;
17
23
  declare namespace ViewStackTrigger {
18
24
  var displayName: string;
19
25
  }
20
- declare function ViewStackView({ id, children }: ViewStackViewProps): react.ReactNode;
26
+ declare function ViewStackView({ id, children }: ViewStackViewProps): react_jsx_runtime.JSX.Element | null;
21
27
  declare namespace ViewStackView {
22
28
  var displayName: string;
23
29
  }
30
+ /**
31
+ * ViewStack - Stack-based view manager for pushing/popping views
32
+ *
33
+ * Manages a stack of views that can be pushed, popped, or reset programmatically
34
+ * and is intended for building nested or stacked UIs such as Drawer views.
35
+ *
36
+ * @example
37
+ * const ids = {
38
+ * stack: uuid(),
39
+ * a: uuid(),
40
+ * b: uuid(),
41
+ * };
42
+ *
43
+ * <ViewStack id={ids.stack} defaultView={ids.a}>
44
+ * <ViewStack.View id={ids.a}>
45
+ * <ViewStack.Trigger for={ids.b}>
46
+ * <Button>
47
+ * Push View B
48
+ * </Button>
49
+ * </ViewStack.Trigger>
50
+ * <h1>View A</h1>
51
+ * </ViewStack.View>
52
+ * <ViewStack.View id={ids.b}>
53
+ * <ViewStack.Trigger for='back'>
54
+ * <Button variant='icon'>
55
+ * <Icon>
56
+ * <ChevronLeft />
57
+ * </Icon>
58
+ * </Button>
59
+ * </ViewStack.Trigger>
60
+ * <h1>View B</h1>
61
+ * </ViewStack.View>
62
+ * </ViewStack>
63
+ */
24
64
  declare function ViewStack({ id, children, defaultView, onChange, }: ViewStackProps): react_jsx_runtime.JSX.Element;
25
65
  declare namespace ViewStack {
26
66
  var displayName: string;
@@ -28,4 +68,4 @@ declare namespace ViewStack {
28
68
  var Trigger: typeof ViewStackTrigger;
29
69
  }
30
70
 
31
- export { ViewStack, ViewStackContext, ViewStackEventHandlers };
71
+ export { ViewStack, ViewStackContext, ViewStackEventHandlers, useViewStackEmit };
@@ -1,4 +1,4 @@
1
1
  'use client';
2
2
 
3
- import {jsx}from'react/jsx-runtime';import'client-only';import {Broadcast}from'@accelint/bus';import {isUUID}from'@accelint/core';import {createContext,useRef,useState,useCallback,useEffect,useContext}from'react';import {Pressable}from'react-aria-components';import {ViewStackEventTypes}from'./events.js';const u=Broadcast.getInstance(),p=createContext({parent:null,stack:[],view:null,register:()=>{},unregister:()=>{}}),T={back:e=>u.emit(ViewStackEventTypes.back,{stack:e}),clear:e=>u.emit(ViewStackEventTypes.clear,{stack:e}),push:e=>u.emit(ViewStackEventTypes.push,{view:e}),reset:e=>u.emit(ViewStackEventTypes.reset,{stack:e})};function P({children:e,for:k}){const{parent:r}=useContext(p);function i(){for(const n of Array.isArray(k)?k:[k]){let[s,a]=isUUID(n)?["push",n]:n.split(":");a??=r,a&&T[s](a);}}return jsx(Pressable,{onPress:i,children:e})}P.displayName="ViewStack.Trigger";function y({id:e,children:k}){const{parent:r,view:i,register:n,unregister:s}=useContext(p);if(!r)throw new Error("ViewStack.View must be implemented within a ViewStack");if(!isUUID(e))throw new Error("ViewStack.View's id must be a UniqueId");return useEffect(()=>{n(e);},[n,s,e]),i===e?k:null}y.displayName="ViewStack.View";function S({id:e,children:k,defaultView:r,onChange:i}){if(!isUUID(e))throw new Error("ViewStack's id must be a UniqueId");const n=useRef(new Set),[s,a]=useState(r?[r]:[]),U=s.at(-1)??null,V=useCallback(t=>{if(e===t?.payload?.stack){const c=s.slice(0,-1);!c.length&&r&&c.push(r),a(c),i?.(c.at(-1)??null);}},[e,r,i,s]),f=useCallback(t=>{e===t?.payload?.stack&&(a([]),i?.(null));},[e,i]),m=useCallback(t=>{n.current.has(t?.payload?.view)&&(a(c=>[...c,t?.payload?.view]),i?.(t?.payload?.view));},[i]),v=useCallback(t=>{e===t?.payload?.stack&&(a(r?[r]:[]),i?.(r??null));},[e,r,i]);return useEffect(()=>{const t=[u.on(ViewStackEventTypes.back,V),u.on(ViewStackEventTypes.clear,f),u.on(ViewStackEventTypes.push,m),u.on(ViewStackEventTypes.reset,v)];return ()=>{for(const c of t)c();}},[V,f,m,v]),jsx(p.Provider,{value:{parent:e,stack:s,view:U,register:t=>n.current.add(t),unregister:t=>n.current.delete(t)},children:k})}S.displayName="ViewStack",S.View=y,S.Trigger=P;export{S as ViewStack,p as ViewStackContext,T as ViewStackEventHandlers};//# sourceMappingURL=index.js.map
3
+ import {jsx}from'react/jsx-runtime';import'client-only';import {Broadcast}from'@accelint/bus';import {useEmit,useOn}from'@accelint/bus/react';import {isUUID}from'@accelint/core';import {createContext,useRef,useState,useCallback,useContext,useEffect,Fragment}from'react';import {Pressable}from'react-aria-components';import {ViewStackEventTypes}from'./events.js';const S=Broadcast.getInstance(),m=createContext({parent:null,stack:[],view:null,register:()=>{},unregister:()=>{}}),G={back:e=>S.emit(ViewStackEventTypes.back,{stack:e}),clear:e=>S.emit(ViewStackEventTypes.clear,{stack:e}),push:e=>S.emit(ViewStackEventTypes.push,{view:e}),reset:e=>S.emit(ViewStackEventTypes.reset,{stack:e})};function C(){const e=useEmit(ViewStackEventTypes.back),c=useEmit(ViewStackEventTypes.clear),r=useEmit(ViewStackEventTypes.push),i=useEmit(ViewStackEventTypes.reset);return {back:t=>e({stack:t}),clear:t=>c({stack:t}),push:t=>r({view:t}),reset:t=>i({stack:t})}}function f({children:e,for:c}){const{parent:r}=useContext(m),i=C();function t(){for(const s of Array.isArray(c)?c:[c]){let[o,k]=isUUID(s)?["push",s]:s.split(":");k??=r,k&&i[o](k);}}return jsx(Pressable,{onPress:t,children:e})}f.displayName="ViewStack.Trigger";function I({id:e,children:c}){const{parent:r,view:i,register:t,unregister:s}=useContext(m);if(!r)throw new Error("ViewStack.View must be implemented within a ViewStack");if(!isUUID(e))throw new Error("ViewStack.View's id must be a UniqueId");return useEffect(()=>(t(e),()=>s(e)),[t,s,e]),i===e?jsx(Fragment,{children:c},e):null}I.displayName="ViewStack.View";function v({id:e,children:c,defaultView:r,onChange:i}){if(!isUUID(e))throw new Error("ViewStack's id must be a UniqueId");const t=useRef(new Set),[s,o]=useState(r?[r]:[]),k=s.at(-1)??null,U=useCallback(n=>{if(e===n?.payload?.stack){const u=s.slice(0,-1);!u.length&&r&&u.push(r),o(u),i?.(u.at(-1)??null);}},[e,r,i,s]),h=useCallback(n=>{e===n?.payload?.stack&&(o([]),i?.(null));},[e,i]),q=useCallback(n=>{t.current.has(n?.payload?.view)&&(o(u=>[...u,n?.payload?.view]),i?.(n?.payload?.view));},[i]),P=useCallback(n=>{e===n?.payload?.stack&&(o(r?[r]:[]),i?.(r??null));},[e,r,i]);return useOn(ViewStackEventTypes.back,U),useOn(ViewStackEventTypes.clear,h),useOn(ViewStackEventTypes.push,q),useOn(ViewStackEventTypes.reset,P),jsx(m.Provider,{value:{parent:e,stack:s,view:k,register:n=>t.current.add(n),unregister:n=>t.current.delete(n)},children:c})}v.displayName="ViewStack",v.View=I,v.Trigger=f;export{v as ViewStack,m as ViewStackContext,G as ViewStackEventHandlers,C as useViewStackEmit};//# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/view-stack/index.tsx"],"names":["Broadcast","h","ViewStackContext","createContext","q","ViewStackEventHandlers","bus","o","types","useContext","d","type","event","isUUID","l","id","parent","I","x","ViewStackTrigger","E","register","unregister","view","b","stack","setStack","useState","defaultView","g","useCallback","data","next","onChange","handleClear","handlePush","views","prev","handleReset","ViewStackEventTypes","off","listeners","handleBack","jsx","ViewStack"],"mappings":"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","file":"index.js","sourcesContent":["/*\n * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n'use client';\n\nimport 'client-only';\nimport { Broadcast } from '@accelint/bus';\nimport { isUUID, type UniqueId } from '@accelint/core';\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { Pressable } from 'react-aria-components';\nimport { ViewStackEventTypes } from './events';\nimport type {\n ViewStackBackEvent,\n ViewStackClearEvent,\n ViewStackContextValue,\n ViewStackEvent,\n ViewStackProps,\n ViewStackPushEvent,\n ViewStackResetEvent,\n ViewStackTriggerProps,\n ViewStackViewProps,\n} from './types';\n\nconst bus = Broadcast.getInstance<ViewStackEvent>();\n\nexport const ViewStackContext = createContext<ViewStackContextValue>({\n parent: null,\n stack: [],\n view: null,\n register: () => undefined,\n unregister: () => undefined,\n});\n\nexport const ViewStackEventHandlers = {\n back: (stack: UniqueId) => bus.emit(ViewStackEventTypes.back, { stack }),\n clear: (stack: UniqueId) => bus.emit(ViewStackEventTypes.clear, { stack }),\n push: (view: UniqueId) => bus.emit(ViewStackEventTypes.push, { view }),\n reset: (stack: UniqueId) => bus.emit(ViewStackEventTypes.reset, { stack }),\n} as const;\n\nfunction ViewStackTrigger({ children, for: types }: ViewStackTriggerProps) {\n const { parent } = useContext(ViewStackContext);\n\n function handlePress() {\n for (const type of Array.isArray(types) ? types : [types]) {\n let [event, id] = (isUUID(type) ? ['push', type] : type.split(':')) as [\n 'back' | 'clear' | 'reset' | 'push',\n UniqueId | undefined | null,\n ];\n\n id ??= parent;\n\n if (!id) {\n continue;\n }\n\n ViewStackEventHandlers[event](id);\n }\n }\n\n return <Pressable onPress={handlePress}>{children}</Pressable>;\n}\nViewStackTrigger.displayName = 'ViewStack.Trigger';\n\nfunction ViewStackView({ id, children }: ViewStackViewProps) {\n const { parent, view, register, unregister } = useContext(ViewStackContext);\n\n if (!parent) {\n throw new Error('ViewStack.View must be implemented within a ViewStack');\n }\n\n if (!isUUID(id)) {\n throw new Error(`ViewStack.View's id must be a UniqueId`);\n }\n\n useEffect(() => {\n register(id);\n\n () => unregister(id);\n }, [register, unregister, id]);\n\n return view === id ? children : null;\n}\nViewStackView.displayName = 'ViewStack.View';\n\nexport function ViewStack({\n id,\n children,\n defaultView,\n onChange,\n}: ViewStackProps) {\n if (!isUUID(id)) {\n throw new Error(`ViewStack's id must be a UniqueId`);\n }\n\n const views = useRef(new Set<UniqueId>());\n const [stack, setStack] = useState<UniqueId[]>(\n defaultView ? [defaultView] : [],\n );\n const view = stack.at(-1) ?? null;\n\n const handleBack = useCallback(\n (data: ViewStackBackEvent) => {\n if (id === data?.payload?.stack) {\n const next = stack.slice(0, -1);\n\n if (!next.length && defaultView) {\n next.push(defaultView);\n }\n\n setStack(next);\n onChange?.(next.at(-1) ?? null);\n }\n },\n [id, defaultView, onChange, stack],\n );\n\n const handleClear = useCallback(\n (data: ViewStackClearEvent) => {\n if (id === data?.payload?.stack) {\n setStack([]);\n onChange?.(null);\n }\n },\n [id, onChange],\n );\n\n const handlePush = useCallback(\n (data: ViewStackPushEvent) => {\n if (views.current.has(data?.payload?.view)) {\n setStack((prev) => [...prev, data?.payload?.view]);\n onChange?.(data?.payload?.view);\n }\n },\n [onChange],\n );\n\n const handleReset = useCallback(\n (data: ViewStackResetEvent) => {\n if (id === data?.payload?.stack) {\n setStack(defaultView ? [defaultView] : []);\n onChange?.(defaultView ?? null);\n }\n },\n [id, defaultView, onChange],\n );\n\n useEffect(() => {\n const listeners = [\n bus.on(ViewStackEventTypes.back, handleBack),\n bus.on(ViewStackEventTypes.clear, handleClear),\n bus.on(ViewStackEventTypes.push, handlePush),\n bus.on(ViewStackEventTypes.reset, handleReset),\n ];\n\n return () => {\n for (const off of listeners) {\n off();\n }\n };\n }, [handleBack, handleClear, handlePush, handleReset]);\n\n return (\n <ViewStackContext.Provider\n value={{\n parent: id,\n stack,\n view,\n register: (view: UniqueId) => views.current.add(view),\n unregister: (view: UniqueId) => views.current.delete(view),\n }}\n >\n {children}\n </ViewStackContext.Provider>\n );\n}\nViewStack.displayName = 'ViewStack';\nViewStack.View = ViewStackView;\nViewStack.Trigger = ViewStackTrigger;\n"]}
1
+ {"version":3,"sources":["../../../src/components/view-stack/index.tsx"],"names":["Broadcast","y","ViewStackContext","createContext","b","ViewStackEventHandlers","bus","a","ViewStackEventTypes","w","useEmit","emitBack","emitClear","emitPush","emitReset","types","useContext","E","viewStackEmit","useViewStackEmit","type","event","isUUID","V","id","parent","d","R","ViewStackTrigger","x","unregister","register","view","Fragment","g","T","stack","setStack","useState","defaultView","B","useCallback","data","next","onChange","handleClear","handlePush","views","prev","handleReset","l","useOn","jsx","ViewStack"],"mappings":"0WAwCYA,MAAU,CAAA,CAAAC,SAAA,CAAA,WAETC,EAAmBC,CAAqC,CACnE,CAAAC,aAAA,CAAA,CAAA,MAAQ,CAAA,IACR,CAAA,KACA,CAAA,EAAA,CAAA,IAAM,CAAA,IACN,CAAA,QAAU,CAAG,IACb,CAAA,CAAA,CAAA,UAAY,CAAG,IAChB,CAEYC,CAAAA,CAAyB,CACpC,CAAA,CAAA,CAAA,CAAA,IAA2BC,CAAAA,CAAI,EAAA,CAAA,CAAA,IAAyB,CAAAC,mBAAA,CAAA,IAAQ,CAAA,CAAA,KAAO,CACvE,CAAA,CAAA,CAAA,CAAA,KAA4BD,EAAI,EAAA,CAAA,CAAA,IAAyB,CAAAC,mBAAA,CAAA,KAAS,CAAA,CAAA,KAAO,CACzE,CAAA,CAAA,CAAA,CAAA,IAA0BD,CAAAA,CAAI,EAAA,CAAA,CAAA,IAAyB,CAAAC,mBAAA,CAAA,IAAQ,CAAA,CAAA,IAAM,CACrE,CAAA,CAAA,CAAA,CAAA,KAA4BD,CAAAA,CAAI,EAAA,CAAA,CAAA,IAAyB,CAAAC,mBAAA,CAAA,KAAS,CAAA,CAAA,KACpE,CAAA,CAEO,CAAA,CAAA,EAAA,SACL,CAAA,EAAA,CAAA,MAAyCC,CAAAA,CAAoBC,OAAA,CAAAF,mBAAA,CAAI,IAC/CG,CAAAA,CAAwBF,EAAoBC,OAAA,CAAAF,mBAAA,CAAA,KAC7CG,CAAAA,CAAwBF,CAAAA,CAAoBC,OAAA,CAAAF,mBAAA,CAAI,IAC/CG,EAAwBF,CAAAA,CAAoBC,OAAA,CAAAF,mBAAA,CAAA,KAE9D,CAAA,CAAA,OACE,CAAA,IAA2BI,CAAAA,CAAS,EAAE,CAAA,CAAA,CAAA,KAAO,CAC7C,CAAA,CAAA,CAAA,CAAA,KAA4BC,CAAAA,CAAU,EAAE,CAAA,CAAA,CAAA,KAAO,CAC/C,CAAA,CAAA,CAAA,CAAA,IAA0BC,CAAAA,CAAS,EAAE,CAAA,CAAA,CAAA,IAAM,CAC3C,CAAA,CAAA,CAAA,CAAA,KAA4BC,CAAAA,CAAU,UACxC,CACF,CAEA,CAAA,CAAA,CAAA,CAAA,SAA4B,CAAA,CAAA,CAAA,QAAU,CAAA,CAAA,CAAKC,GAAgC,CACzE,CAAA,CAAA,CAAA,CAAA,YAAmBC,CAAAA,CAAWd,CAAgB,CAAAe,UACxCC,CAAAA,CAAgBC,CAAAA,CAAiB,CAAA,CAEvC,CAAA,EAAA,CAAA,SACE,CAAA,EAAA,CAAA,IAAA,MAAWC,CAAQ,IAAA,KAAM,CAAA,OAAiBL,CAAAA,CAAQ,CAACA,CAAK,CAAA,CAAG,CACzD,CAAA,CAAA,CAAI,CAACM,GAAS,CAAA,CAAKC,CAAAA,CAAOF,CAAI,CAAAG,MAAI,CAAC,CAAA,CAAA,CAAA,CAAA,MAAgBH,CAAAA,CAAK,CAAA,CAAA,CAAA,CAAA,KAAS,CAAA,GAKjEI,CAAAA,CAAOC,CAAAA,GAEFD,CAILN,CAAAA,CAAcG,EAAK,CAAEG,CAAE,CACzB,CACF,CAEA,CAAA,EAAA,CAAA,CAAA,OAAQE,GAAU,CAAAC,SAAA,CAAA,CAAA,OAAuB,CAAA,CAAA,CAAA,QAC3C,CACAC,CAAAA,CAAiB,CAAA,CAAA,CAAA,CAAA,WAAc,CAAA,mBAE/B,CAAA,SAAyB,CAAA,CAAAJ,CAAAA,EAAI,CAAA,CAAA,CAAA,QAAgC,CAC3D,CAAA,CAAA,CAAA,CAAA,KAAQ,CAAA,MAAQ,CAAA,CAAA,CAAA,eAAgB,CAAA,CAAA,CAAA,UAAeR,CAAAA,CAAWd,CAAgB,CAAAe,UAE1E,CAAA,CAAA,CAAI,CAACQ,GACH,CAAA,CAAA,CAAA,MAAU,IAAA,KAAM,CAAA,uDAGlB,CAAI,CAACH,GAAS,CAAAC,MACZ,CAAA,CAAA,CAAA,CAAA,MAAU,IAAA,KAAM,CAAA,iDAGRM,SAAA,CAAA,KACG,CAEJ,CAAA,CAAA,CAAA,CAAMC,IAAa,CAAA,CACzB,CAACC,CAAAA,CAAUD,CAAAA,CAAYN,CAAE,CAAC,CAAA,CAEtBQ,CAAAA,CAAAA,CAAAA,CAASR,IAAMS,CAAAA,CAAAP,GAAmB,CAAAQ,QAAA,CAAA,CAAA,QAALV,CAAc,CAAA,CAAc,CAAA,CAAA,CAAA,CAClE,IACc,CAAA,CAAA,CAAA,WAAc,CAAA,gBAoCrB,CAAA,SACL,CAAA,CAAAA,GACA,CAAA,CAAA,CAAA,QACA,CAAA,CAAA,CAAA,WACA,CAAA,CAAA,CAAA,QACiB,CACjB,CAAA,CAAA,CAAI,CAACF,GAAS,CAAAC,MACZ,CAAA,CAAA,CAAA,CAAA,MAAU,IAAA,yCAGZ,CAAA,CAAA,MAAqB,CAAA,CAAAY,MAAA,CAAI,IAAe,GACjCC,CAAOC,CAAQ,CAAA,CAAIC,CAAAA,CACxBC,CAAAA,CAAcC,QAACD,CAAW,CAAA,CAAI,CAAC,CACjC,CAAA,CACMP,EAAOI,CAAAA,CAAM,CAAA,CAAA,CAAG,CAAA,EAAE,CAAA,EAAK,CAAA,EAAA,IAEVK,CAChBC,CAAAA,CAAAA,WAA6B,CAC5B,CAAA,EAAIlB,CAAAA,GAAOkB,CAAAA,GAAM,CAAA,EAAA,cACf,CAAA,CAAA,MAAmB,CAAA,CAAA,CAAA,CAAA,KAAS,CAAE,CAAA,CAE1B,EAACC,CAAK,CAAA,CAAA,CAAA,CAAA,MAAUJ,EAClBI,CAAK,EAAA,CAAA,CAAA,IAGPN,EAASM,CAAI,CAAA,CACbC,CAAAA,CAAAA,CAAAA,CAAWD,CAAAA,GAAK,CAAG,CAAA,EAAE,CAAA,EAAK,CAAA,EAAI,IAGlC,EAACnB,CAAAA,CAAIe,CAAAA,CAAaK,CAAAA,CAAUR,CAAK,CACnC,EAEMS,CAAAA,CAAcJ,CAAAA,CACjBC,CAAAA,CAAAA,WAA8B,CACzBlB,CAAAA,EAAAA,CAAOkB,CAAAA,GAAM,CAAA,EAAA,OAAS,EAAA,KACxBL,GAAW,CAAA,CACXO,EAAAA,CAAAA,CAAW,CAAA,GAAI,IAGnB,CAACpB,EAAAA,CAAIoB,CAAQ,CACf,CAAA,CAEME,CAAAA,CAAaL,CAAAA,CAChBC,CAAAA,CAAAA,WAA6B,CACxBK,CAAAA,EAAM,CAAA,CAAA,CAAA,OAAQ,CAAIL,GAAM,CAAA,CAAA,EAAA,OAAS,EAAI,IACvCL,CAAAA,IAAmB,CAAC,CAAA,EAAGW,CAAAA,GAAMN,CAAM,CAAA,CAAA,EAAA,OAAS,EAAI,IAChDE,CAAAA,CAAAA,CAAWF,CAAAA,GAAM,CAAA,EAAA,OAAS,EAAI,IAGlC,CAACE,EAAQ,CACX,CAAA,CAEMK,CAAAA,CAAcR,CAAAA,CACjBC,CAAAA,CAAAA,WAA8B,CACzBlB,CAAAA,EAAAA,CAAOkB,CAAAA,GAAM,CAAA,EAAA,cACfL,GAAuB,CAACE,CAAW,CAAA,CAAI,CAAC,CAAC,CAAA,CACzCK,IAAWL,CAAAA,GAAe,CAAA,EAAI,IAGlC,CAACf,EAAAA,CAAIe,CAAAA,CAAaK,CAAQ,CAC5B,CAAA,CACA,CAAA,CAAA,CAAA,CAAA,OAA0BM,KAAA,CAAA3C,mBAAA,CAAA,IAC1B4C,EAAM3C,CAAAA,CAAoB0C,KAAA,CAAA3C,mBAAA,CAAA,KAC1B4C,CAAAA,CAAM3C,CAAAA,CAAoB0C,KAAA,CAAA3C,mBAAA,CAAA,IAC1B4C,CAAAA,CAAM3C,CAAAA,CAAoB0C,KAAA,CAAA3C,mBAAA,CAAA,KAGxB6C,CAAAA,CAAClD,CAAAA,CAAiBwB,cAChB,CAAA,CAAA,KACE,CAAA,CAAA,MACA,CAAA,CAAA,CAAA,KACA,CAAA,CAAA,CAAA,IACA,CAAA,CAAA,CAAA,QAA8BqB,CAAAA,CAAM,EAAA,CAAA,CAAA,OAAQ,CAAIf,GAChD,cAAgCe,CAAAA,CAAM,EAAA,CAAA,CAAA,OAAQ,CAAA,MAChD,CAEC,CAAA,CAAA,CAAA,CAAA,QAGP,CACAM,CAAAA,CAAU,CAAA,CAAA,CAAA,CAAA,WAAc,CAAA,WACd,CAAA,CAAA,CAAA,KACA,CAAA,CAAA,CAAA,CAAA,OAAUzB,CAAAA,CAAAA","file":"index.js","sourcesContent":["/*\n * Copyright 2025 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n'use client';\n\nimport 'client-only';\nimport { Broadcast } from '@accelint/bus';\nimport { useEmit, useOn } from '@accelint/bus/react';\nimport { isUUID, type UniqueId } from '@accelint/core';\nimport {\n createContext,\n Fragment,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { Pressable } from 'react-aria-components';\nimport { ViewStackEventTypes } from './events';\nimport type {\n ViewStackBackEvent,\n ViewStackClearEvent,\n ViewStackContextValue,\n ViewStackEvent,\n ViewStackProps,\n ViewStackPushEvent,\n ViewStackResetEvent,\n ViewStackTriggerProps,\n ViewStackViewProps,\n} from './types';\n\nconst bus = Broadcast.getInstance<ViewStackEvent>();\n\nexport const ViewStackContext = createContext<ViewStackContextValue>({\n parent: null,\n stack: [],\n view: null,\n register: () => undefined,\n unregister: () => undefined,\n});\n\nexport const ViewStackEventHandlers = {\n back: (stack: UniqueId) => bus.emit(ViewStackEventTypes.back, { stack }),\n clear: (stack: UniqueId) => bus.emit(ViewStackEventTypes.clear, { stack }),\n push: (view: UniqueId) => bus.emit(ViewStackEventTypes.push, { view }),\n reset: (stack: UniqueId) => bus.emit(ViewStackEventTypes.reset, { stack }),\n} as const;\n\nexport function useViewStackEmit() {\n const emitBack = useEmit<ViewStackEvent>(ViewStackEventTypes.back);\n const emitClear = useEmit<ViewStackEvent>(ViewStackEventTypes.clear);\n const emitPush = useEmit<ViewStackEvent>(ViewStackEventTypes.push);\n const emitReset = useEmit<ViewStackEvent>(ViewStackEventTypes.reset);\n\n return {\n back: (stack: UniqueId) => emitBack({ stack }),\n clear: (stack: UniqueId) => emitClear({ stack }),\n push: (view: UniqueId) => emitPush({ view }),\n reset: (stack: UniqueId) => emitReset({ stack }),\n } as const;\n}\n\nfunction ViewStackTrigger({ children, for: types }: ViewStackTriggerProps) {\n const { parent } = useContext(ViewStackContext);\n const viewStackEmit = useViewStackEmit();\n\n function handlePress() {\n for (const type of Array.isArray(types) ? types : [types]) {\n let [event, id] = (isUUID(type) ? ['push', type] : type.split(':')) as [\n 'back' | 'clear' | 'reset' | 'push',\n UniqueId | undefined | null,\n ];\n\n id ??= parent;\n\n if (!id) {\n continue;\n }\n\n viewStackEmit[event](id);\n }\n }\n\n return <Pressable onPress={handlePress}>{children}</Pressable>;\n}\nViewStackTrigger.displayName = 'ViewStack.Trigger';\n\nfunction ViewStackView({ id, children }: ViewStackViewProps) {\n const { parent, view, register, unregister } = useContext(ViewStackContext);\n\n if (!parent) {\n throw new Error('ViewStack.View must be implemented within a ViewStack');\n }\n\n if (!isUUID(id)) {\n throw new Error(`ViewStack.View's id must be a UniqueId`);\n }\n\n useEffect(() => {\n register(id);\n\n return () => unregister(id);\n }, [register, unregister, id]);\n\n return view === id ? <Fragment key={id}>{children}</Fragment> : null;\n}\nViewStackView.displayName = 'ViewStack.View';\n\n/**\n * ViewStack - Stack-based view manager for pushing/popping views\n *\n * Manages a stack of views that can be pushed, popped, or reset programmatically\n * and is intended for building nested or stacked UIs such as Drawer views.\n *\n * @example\n * const ids = {\n * stack: uuid(),\n * a: uuid(),\n * b: uuid(),\n * };\n *\n * <ViewStack id={ids.stack} defaultView={ids.a}>\n * <ViewStack.View id={ids.a}>\n * <ViewStack.Trigger for={ids.b}>\n * <Button>\n * Push View B\n * </Button>\n * </ViewStack.Trigger>\n * <h1>View A</h1>\n * </ViewStack.View>\n * <ViewStack.View id={ids.b}>\n * <ViewStack.Trigger for='back'>\n * <Button variant='icon'>\n * <Icon>\n * <ChevronLeft />\n * </Icon>\n * </Button>\n * </ViewStack.Trigger>\n * <h1>View B</h1>\n * </ViewStack.View>\n * </ViewStack>\n */\nexport function ViewStack({\n id,\n children,\n defaultView,\n onChange,\n}: ViewStackProps) {\n if (!isUUID(id)) {\n throw new Error(`ViewStack's id must be a UniqueId`);\n }\n\n const views = useRef(new Set<UniqueId>());\n const [stack, setStack] = useState<UniqueId[]>(\n defaultView ? [defaultView] : [],\n );\n const view = stack.at(-1) ?? null;\n\n const handleBack = useCallback(\n (data: ViewStackBackEvent) => {\n if (id === data?.payload?.stack) {\n const next = stack.slice(0, -1);\n\n if (!next.length && defaultView) {\n next.push(defaultView);\n }\n\n setStack(next);\n onChange?.(next.at(-1) ?? null);\n }\n },\n [id, defaultView, onChange, stack],\n );\n\n const handleClear = useCallback(\n (data: ViewStackClearEvent) => {\n if (id === data?.payload?.stack) {\n setStack([]);\n onChange?.(null);\n }\n },\n [id, onChange],\n );\n\n const handlePush = useCallback(\n (data: ViewStackPushEvent) => {\n if (views.current.has(data?.payload?.view)) {\n setStack((prev) => [...prev, data?.payload?.view]);\n onChange?.(data?.payload?.view);\n }\n },\n [onChange],\n );\n\n const handleReset = useCallback(\n (data: ViewStackResetEvent) => {\n if (id === data?.payload?.stack) {\n setStack(defaultView ? [defaultView] : []);\n onChange?.(defaultView ?? null);\n }\n },\n [id, defaultView, onChange],\n );\n useOn(ViewStackEventTypes.back, handleBack);\n useOn(ViewStackEventTypes.clear, handleClear);\n useOn(ViewStackEventTypes.push, handlePush);\n useOn(ViewStackEventTypes.reset, handleReset);\n\n return (\n <ViewStackContext.Provider\n value={{\n parent: id,\n stack,\n view,\n register: (view: UniqueId) => views.current.add(view),\n unregister: (view: UniqueId) => views.current.delete(view),\n }}\n >\n {children}\n </ViewStackContext.Provider>\n );\n}\nViewStack.displayName = 'ViewStack';\nViewStack.View = ViewStackView;\nViewStack.Trigger = ViewStackTrigger;\n"]}
package/dist/index.css CHANGED
@@ -11,8 +11,8 @@
11
11
  */
12
12
 
13
13
  /* @import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..700;1,100..700&family=Roboto:ital,wght@0,100..900;1,100..900&display=swap'); */
14
- @import '@fontsource/roboto-flex';
15
- @import '@fontsource/roboto-mono';
14
+ @import '@fontsource-variable/roboto-flex';
15
+ @import '@fontsource-variable/roboto-mono';
16
16
  @import 'tailwindcss';
17
17
 
18
18
  /* Import generated themes.css */
@@ -164,7 +164,9 @@
164
164
  --icon-color: --value(--color- *);
165
165
  }
166
166
 
167
- body {
167
+ html {
168
+ @apply bg-surface-default;
169
+ @apply fg-primary-bold;
168
170
  @apply font-primary;
169
171
  }
170
172