@rinzai/zen 0.6.0 → 0.7.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 (173) hide show
  1. package/LICENSE +27 -0
  2. package/README.md +12 -4
  3. package/dist/alert/index.d.ts +21 -0
  4. package/dist/alert/index.d.ts.map +1 -0
  5. package/dist/alert/index.js +49 -0
  6. package/dist/button/index.d.ts +2 -1
  7. package/dist/button/index.d.ts.map +1 -1
  8. package/dist/button/index.js +43 -12
  9. package/dist/calendar/index.d.ts.map +1 -1
  10. package/dist/calendar/index.js +86 -85
  11. package/dist/chart/donut.d.ts +4 -1
  12. package/dist/chart/donut.d.ts.map +1 -1
  13. package/dist/chart/donut.js +81 -60
  14. package/dist/chart/index.d.ts +8 -2
  15. package/dist/chart/index.d.ts.map +1 -1
  16. package/dist/chart/index.js +151 -139
  17. package/dist/chart/palette.d.ts +11 -0
  18. package/dist/chart/palette.d.ts.map +1 -0
  19. package/dist/chart/palette.js +9 -0
  20. package/dist/chart/tooltip.d.ts +6 -2
  21. package/dist/chart/tooltip.d.ts.map +1 -1
  22. package/dist/chart/tooltip.js +6 -6
  23. package/dist/checkbox/index.d.ts.map +1 -1
  24. package/dist/checkbox/index.js +28 -44
  25. package/dist/chip/index.js +1 -1
  26. package/dist/code-block/index.js +1 -1
  27. package/dist/combobox/index.d.ts.map +1 -1
  28. package/dist/combobox/index.js +93 -91
  29. package/dist/date-picker/index.d.ts.map +1 -1
  30. package/dist/date-picker/index.js +24 -38
  31. package/dist/disclosure/index.js +1 -1
  32. package/dist/editable-cell/index.js +1 -1
  33. package/dist/field/index.d.ts +1 -1
  34. package/dist/field/index.d.ts.map +1 -1
  35. package/dist/field/index.js +33 -32
  36. package/dist/header/index.d.ts +9 -1
  37. package/dist/header/index.d.ts.map +1 -1
  38. package/dist/header/index.js +17 -9
  39. package/dist/icons/arrow-left.d.ts +3 -0
  40. package/dist/icons/arrow-left.d.ts.map +1 -0
  41. package/dist/icons/arrow-right.d.ts +3 -0
  42. package/dist/icons/arrow-right.d.ts.map +1 -0
  43. package/dist/icons/bars.d.ts +3 -0
  44. package/dist/icons/bars.d.ts.map +1 -0
  45. package/dist/icons/calendar.d.ts +3 -0
  46. package/dist/icons/calendar.d.ts.map +1 -0
  47. package/dist/icons/chart-bar.d.ts +3 -0
  48. package/dist/icons/chart-bar.d.ts.map +1 -0
  49. package/dist/icons/chevron-down.d.ts.map +1 -1
  50. package/dist/icons/chevron-down.js +4 -2
  51. package/dist/icons/chevron-left.d.ts.map +1 -1
  52. package/dist/icons/chevron-left.js +4 -2
  53. package/dist/icons/chevron-right.d.ts.map +1 -1
  54. package/dist/icons/chevron-right.js +4 -2
  55. package/dist/icons/chevron-up.d.ts.map +1 -1
  56. package/dist/icons/chevron-up.js +4 -2
  57. package/dist/icons/ellipsis.d.ts +0 -1
  58. package/dist/icons/ellipsis.d.ts.map +1 -1
  59. package/dist/icons/flag.d.ts +3 -0
  60. package/dist/icons/flag.d.ts.map +1 -0
  61. package/dist/icons/list-bullet.d.ts +3 -0
  62. package/dist/icons/list-bullet.d.ts.map +1 -0
  63. package/dist/icons/lock.d.ts +3 -0
  64. package/dist/icons/lock.d.ts.map +1 -0
  65. package/dist/icons/logout.d.ts +3 -0
  66. package/dist/icons/logout.d.ts.map +1 -0
  67. package/dist/icons/micro/calendar.d.ts +3 -0
  68. package/dist/icons/micro/calendar.d.ts.map +1 -0
  69. package/dist/icons/micro/calendar.js +21 -0
  70. package/dist/icons/micro/check.d.ts +3 -0
  71. package/dist/icons/micro/check.d.ts.map +1 -0
  72. package/dist/icons/micro/check.js +21 -0
  73. package/dist/icons/micro/chevron-down.d.ts +3 -0
  74. package/dist/icons/micro/chevron-down.d.ts.map +1 -0
  75. package/dist/icons/micro/chevron-down.js +21 -0
  76. package/dist/icons/micro/chevron-right.d.ts +3 -0
  77. package/dist/icons/micro/chevron-right.d.ts.map +1 -0
  78. package/dist/icons/micro/chevron-right.js +21 -0
  79. package/dist/icons/micro/exclamation-triangle.d.ts +3 -0
  80. package/dist/icons/micro/exclamation-triangle.d.ts.map +1 -0
  81. package/dist/icons/micro/exclamation-triangle.js +21 -0
  82. package/dist/icons/micro/information-circle.d.ts +3 -0
  83. package/dist/icons/micro/information-circle.d.ts.map +1 -0
  84. package/dist/icons/micro/information-circle.js +21 -0
  85. package/dist/icons/micro/minus.d.ts +3 -0
  86. package/dist/icons/micro/minus.d.ts.map +1 -0
  87. package/dist/icons/micro/minus.js +17 -0
  88. package/dist/icons/micro/moon.d.ts +3 -0
  89. package/dist/icons/micro/moon.d.ts.map +1 -0
  90. package/dist/icons/micro/moon.js +17 -0
  91. package/dist/icons/micro/sun.d.ts +3 -0
  92. package/dist/icons/micro/sun.d.ts.map +1 -0
  93. package/dist/icons/micro/sun.js +17 -0
  94. package/dist/icons/micro/x-mark.d.ts +3 -0
  95. package/dist/icons/micro/x-mark.d.ts.map +1 -0
  96. package/dist/icons/micro/x-mark.js +17 -0
  97. package/dist/icons/search.d.ts.map +1 -1
  98. package/dist/icons/search.js +4 -2
  99. package/dist/icons/settings.d.ts +3 -0
  100. package/dist/icons/settings.d.ts.map +1 -0
  101. package/dist/icons/squares.d.ts +3 -0
  102. package/dist/icons/squares.d.ts.map +1 -0
  103. package/dist/icons/table.d.ts +3 -0
  104. package/dist/icons/table.d.ts.map +1 -0
  105. package/dist/icons/x-mark.d.ts.map +1 -1
  106. package/dist/icons/x-mark.js +4 -2
  107. package/dist/index.d.ts +6 -4
  108. package/dist/index.d.ts.map +1 -1
  109. package/dist/lib.js +56 -61
  110. package/dist/menu/index.d.ts.map +1 -1
  111. package/dist/menu/index.js +67 -60
  112. package/dist/meter/index.d.ts +4 -3
  113. package/dist/meter/index.d.ts.map +1 -1
  114. package/dist/meter/index.js +9 -8
  115. package/dist/money-input/index.d.ts +7 -8
  116. package/dist/money-input/index.d.ts.map +1 -1
  117. package/dist/money-input/index.js +37 -19
  118. package/dist/month-picker/index.d.ts.map +1 -1
  119. package/dist/month-picker/index.js +55 -55
  120. package/dist/pills/index.d.ts +1 -1
  121. package/dist/pills/index.d.ts.map +1 -1
  122. package/dist/pills/index.js +6 -2
  123. package/dist/popover/index.d.ts.map +1 -1
  124. package/dist/popover/index.js +15 -13
  125. package/dist/select/index.d.ts.map +1 -1
  126. package/dist/select/index.js +96 -102
  127. package/dist/slider/index.d.ts.map +1 -1
  128. package/dist/slider/index.js +1 -1
  129. package/dist/status-pill/index.d.ts +18 -0
  130. package/dist/status-pill/index.d.ts.map +1 -0
  131. package/dist/status-pill/index.js +25 -0
  132. package/dist/tab-bar/index.js +1 -1
  133. package/dist/table/index.js +1 -1
  134. package/dist/tabs/index.d.ts.map +1 -1
  135. package/dist/tabs/index.js +9 -5
  136. package/dist/theme-toggle/index.d.ts +2 -1
  137. package/dist/theme-toggle/index.d.ts.map +1 -1
  138. package/dist/theme-toggle/index.js +35 -32
  139. package/dist/theme.css +81 -19
  140. package/dist/toast/index.d.ts.map +1 -1
  141. package/dist/toast/index.js +119 -106
  142. package/dist/tooltip/index.d.ts.map +1 -1
  143. package/dist/tooltip/index.js +45 -43
  144. package/dist/tree/index.d.ts +22 -3
  145. package/dist/tree/index.d.ts.map +1 -1
  146. package/dist/tree/index.js +76 -56
  147. package/dist/utils/date.d.ts +6 -4
  148. package/dist/utils/date.d.ts.map +1 -1
  149. package/dist/utils/date.js +18 -16
  150. package/dist/utils/field-chevron.d.ts.map +1 -1
  151. package/dist/utils/field-chevron.js +5 -14
  152. package/dist/utils/status-icons.d.ts +1 -1
  153. package/dist/utils/status-icons.d.ts.map +1 -1
  154. package/dist/utils/status-icons.js +11 -41
  155. package/dist/utils/styles.d.ts +9 -3
  156. package/dist/utils/styles.d.ts.map +1 -1
  157. package/dist/utils/styles.js +2 -2
  158. package/dist/utils/theme-wave.d.ts +24 -0
  159. package/dist/utils/theme-wave.d.ts.map +1 -0
  160. package/dist/utils/theme-wave.js +219 -0
  161. package/dist/utils/typeahead.d.ts +12 -0
  162. package/dist/utils/typeahead.d.ts.map +1 -0
  163. package/dist/utils/typeahead.js +19 -0
  164. package/dist/utils/useAnchoredPopup.d.ts +23 -7
  165. package/dist/utils/useAnchoredPopup.d.ts.map +1 -1
  166. package/dist/utils/useAnchoredPopup.js +86 -30
  167. package/dist/zen.css +1 -1
  168. package/package.json +2 -1
  169. package/dist/icons/ellipsis.js +0 -31
  170. package/dist/icons/index.d.ts +0 -9
  171. package/dist/icons/index.d.ts.map +0 -1
  172. package/dist/icons/status.d.ts +0 -2
  173. package/dist/icons/status.d.ts.map +0 -1
@@ -1,5 +1,10 @@
1
- /** Shared field look: faint glass, hairline border lit by the pointer, violet glow on focus. */
1
+ /** Shared field look: faint glass, a hairline in the glow colour (white would grey it out) lit by the pointer, violet glow on focus. */
2
2
  export declare const FIELD: string;
3
+ /** A picker's previous/next arrows (Calendar, MonthPicker). */
4
+ export declare const PICKER_NAV = "text-muted-foreground cursor-pointer hover:bg-tint/[0.07] hover:text-foreground focus-visible:ring-ring/50 grid size-8 place-items-center rounded-md outline-hidden transition-colors focus-visible:ring-2";
5
+ /** A month in a picker's month grid (Calendar, MonthPicker); add PICKER_MONTH_ON for the chosen one. */
6
+ export declare const PICKER_MONTH = "cursor-pointer rounded-lg py-2 text-sm outline-hidden transition-colors disabled:cursor-not-allowed disabled:opacity-35 focus-visible:ring-ring/50 focus-visible:ring-2 hover:bg-tint/[0.07]";
7
+ export declare const PICKER_MONTH_ON = "bg-primary text-primary-foreground hover:bg-primary";
3
8
  /** Glow a trigger carries while its popup is open. */
4
9
  export declare const TRIGGER_OPEN = "border-glow/60 [--glow-border-color:transparent] shadow-[0_0_0_3px_oklch(var(--glow)/0.16),0_0_24px_-6px_oklch(var(--glow)/0.6)]";
5
10
  /** Trigger for popup fields (dropdown): a field that glows while open. */
@@ -8,9 +13,10 @@ export declare const TRIGGER: string;
8
13
  export declare const POPUP = "glass glass-blur rounded-xl text-foreground shadow-[var(--popup-shadow),0_0_40px_-20px_oklch(var(--glow)/0.5)] outline-hidden";
9
14
  /** Pills (and TabList variant="pills"): a glass track… */
10
15
  export declare const PILL_TRACK = "glow-edge relative flex w-fit items-center gap-1 rounded-full border border-tint/5 bg-tint/[0.03] p-1";
11
- /** …a glowing pill that slides to the active item… */
16
+ /** …a glowing pill that slides to the active item (its look is repeated in theme.css, for before it's measured)… */
12
17
  export declare const PILL_INDICATOR = "absolute top-1 bottom-1 left-0 rounded-full bg-primary/15 shadow-[inset_0_0_0_1px_oklch(var(--glow)/0.35),0_0_24px_-4px_oklch(var(--glow)/0.6)] transition-[translate,width] duration-500 ease-[cubic-bezier(0.2,0.8,0.2,1)]";
13
- /** …and items that sit above it, lit when current (a link) or selected (a tab). */
18
+ /** …and items that sit above it, lit when current (a link) or selected (a tab). Only their text colour
19
+ * transitions: the pill they wear before the indicator is measured (theme.css) must go at once. */
14
20
  export declare const PILL: string;
15
21
  /**
16
22
  * For a wrapper whose child input takes focus (InputGroup): FIELD, lit by
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../packages/utils/styles.ts"],"names":[],"mappings":"AAEA,gGAAgG;AAChG,eAAO,MAAM,KAAK,QAKmC,CAAC;AAEtD,sDAAsD;AACtD,eAAO,MAAM,YAAY,qIAC6G,CAAC;AAEvI,0EAA0E;AAC1E,eAAO,MAAM,OAAO,QAAgF,CAAC;AAErG,oEAAoE;AACpE,eAAO,MAAM,KAAK,kIACiH,CAAC;AAEpI,0DAA0D;AAC1D,eAAO,MAAM,UAAU,0GACoF,CAAC;AAE5G,sDAAsD;AACtD,eAAO,MAAM,cAAc,iOACuM,CAAC;AAEnO,mFAAmF;AACnF,eAAO,MAAM,IAAI,QAEkG,CAAC;AAEpH;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAK4B,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../packages/utils/styles.ts"],"names":[],"mappings":"AAEA,wIAAwI;AACxI,eAAO,MAAM,KAAK,QAKmC,CAAC;AAEtD,+DAA+D;AAC/D,eAAO,MAAM,UAAU,+MACyL,CAAC;AAEjN,wGAAwG;AACxG,eAAO,MAAM,YAAY,iMACyK,CAAC;AACnM,eAAO,MAAM,eAAe,wDAAwD,CAAC;AAErF,sDAAsD;AACtD,eAAO,MAAM,YAAY,qIAC6G,CAAC;AAEvI,0EAA0E;AAC1E,eAAO,MAAM,OAAO,QAA+F,CAAC;AAEpH,oEAAoE;AACpE,eAAO,MAAM,KAAK,kIACiH,CAAC;AAEpI,0DAA0D;AAC1D,eAAO,MAAM,UAAU,0GACoF,CAAC;AAE5G,oHAAoH;AACpH,eAAO,MAAM,cAAc,iOACuM,CAAC;AAEnO;mGACmG;AACnG,eAAO,MAAM,IAAI,QAEkG,CAAC;AAEpH;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAK4B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { cx as e } from "./cx.js";
3
3
  //#region packages/utils/styles.ts
4
- var t = "glow-border h-10 rounded-lg border [--glow-border-color:oklch(var(--tint)/0.1)] bg-tint/[0.035] px-3 text-sm text-foreground shadow-[inset_0_1px_0_hsl(0_0%_100%/0.04)] transition-[border-color,background-color,box-shadow,--glow-border-color] duration-200 placeholder:text-muted-foreground hover:[--glow-border-color:oklch(var(--tint)/0.2)] focus-visible:border-glow/60 focus-visible:[--glow-border-color:transparent] focus-visible:bg-tint/[0.05] focus-visible:shadow-[0_0_0_3px_oklch(var(--glow)/0.16),0_0_24px_-6px_oklch(var(--glow)/0.6)] focus-visible:outline-hidden disabled:cursor-not-allowed disabled:opacity-50", n = "border-glow/60 [--glow-border-color:transparent] shadow-[0_0_0_3px_oklch(var(--glow)/0.16),0_0_24px_-6px_oklch(var(--glow)/0.6)]", r = e(t, "inline-flex items-center justify-between gap-2 whitespace-nowrap"), i = "glass glass-blur rounded-xl text-foreground shadow-[var(--popup-shadow),0_0_40px_-20px_oklch(var(--glow)/0.5)] outline-hidden", a = "glow-edge relative flex w-fit items-center gap-1 rounded-full border border-tint/5 bg-tint/[0.03] p-1", o = "absolute top-1 bottom-1 left-0 rounded-full bg-primary/15 shadow-[inset_0_0_0_1px_oklch(var(--glow)/0.35),0_0_24px_-4px_oklch(var(--glow)/0.6)] transition-[translate,width] duration-500 ease-[cubic-bezier(0.2,0.8,0.2,1)]", s = "relative z-10 rounded-full px-3.5 py-1.5 text-sm whitespace-nowrap outline-hidden transition-colors duration-300 select-none focus-visible:ring-2 focus-visible:ring-ring/40 text-muted-foreground hover:text-foreground aria-[current=page]:text-foreground aria-selected:text-foreground", c = "glow-border flex w-full items-center gap-1.5 h-10 rounded-lg border [--glow-border-color:oklch(var(--tint)/0.1)] bg-tint/[0.035] px-3 text-sm text-foreground shadow-[inset_0_1px_0_hsl(0_0%_100%/0.04)] transition-[border-color,background-color,box-shadow,--glow-border-color] duration-200 placeholder:text-muted-foreground hover:[--glow-border-color:oklch(var(--tint)/0.2)] focus-within:border-glow/60 focus-within:[--glow-border-color:transparent] focus-within:bg-tint/[0.05] focus-within:shadow-[0_0_0_3px_oklch(var(--glow)/0.16),0_0_24px_-6px_oklch(var(--glow)/0.6)] focus-within:outline-hidden disabled:cursor-not-allowed disabled:opacity-50";
4
+ var t = "glow-border h-10 rounded-lg border [--glow-border-color:oklch(var(--glow)/0.22)] bg-tint/[0.035] px-3 text-sm text-foreground shadow-[inset_0_1px_0_hsl(0_0%_100%/0.04)] transition-[border-color,background-color,box-shadow,--glow-border-color] duration-200 placeholder:text-muted-foreground hover:[--glow-border-color:oklch(var(--glow)/0.4)] focus-visible:border-glow/60 focus-visible:[--glow-border-color:transparent] focus-visible:bg-tint/[0.05] focus-visible:shadow-[0_0_0_3px_oklch(var(--glow)/0.16),0_0_24px_-6px_oklch(var(--glow)/0.6)] focus-visible:outline-hidden disabled:cursor-not-allowed disabled:opacity-50", n = "text-muted-foreground cursor-pointer hover:bg-tint/[0.07] hover:text-foreground focus-visible:ring-ring/50 grid size-8 place-items-center rounded-md outline-hidden transition-colors focus-visible:ring-2", r = "cursor-pointer rounded-lg py-2 text-sm outline-hidden transition-colors disabled:cursor-not-allowed disabled:opacity-35 focus-visible:ring-ring/50 focus-visible:ring-2 hover:bg-tint/[0.07]", i = "bg-primary text-primary-foreground hover:bg-primary", a = "border-glow/60 [--glow-border-color:transparent] shadow-[0_0_0_3px_oklch(var(--glow)/0.16),0_0_24px_-6px_oklch(var(--glow)/0.6)]", o = e(t, "inline-flex cursor-pointer items-center justify-between gap-2 whitespace-nowrap"), s = "glass glass-blur rounded-xl text-foreground shadow-[var(--popup-shadow),0_0_40px_-20px_oklch(var(--glow)/0.5)] outline-hidden", c = "glow-edge relative flex w-fit items-center gap-1 rounded-full border border-tint/5 bg-tint/[0.03] p-1", l = "absolute top-1 bottom-1 left-0 rounded-full bg-primary/15 shadow-[inset_0_0_0_1px_oklch(var(--glow)/0.35),0_0_24px_-4px_oklch(var(--glow)/0.6)] transition-[translate,width] duration-500 ease-[cubic-bezier(0.2,0.8,0.2,1)]", u = "relative z-10 cursor-pointer disabled:cursor-not-allowed rounded-full px-3.5 py-1.5 text-sm whitespace-nowrap outline-hidden transition-[color] duration-300 select-none focus-visible:ring-2 focus-visible:ring-ring/40 text-muted-foreground hover:text-foreground aria-[current=page]:text-foreground aria-selected:text-foreground", d = "glow-border flex w-full items-center gap-1.5 h-10 rounded-lg border [--glow-border-color:oklch(var(--glow)/0.22)] bg-tint/[0.035] px-3 text-sm text-foreground shadow-[inset_0_1px_0_hsl(0_0%_100%/0.04)] transition-[border-color,background-color,box-shadow,--glow-border-color] duration-200 placeholder:text-muted-foreground hover:[--glow-border-color:oklch(var(--glow)/0.4)] focus-within:border-glow/60 focus-within:[--glow-border-color:transparent] focus-within:bg-tint/[0.05] focus-within:shadow-[0_0_0_3px_oklch(var(--glow)/0.16),0_0_24px_-6px_oklch(var(--glow)/0.6)] focus-within:outline-hidden disabled:cursor-not-allowed disabled:opacity-50";
5
5
  //#endregion
6
- export { t as FIELD, c as FIELD_WITHIN, s as PILL, o as PILL_INDICATOR, a as PILL_TRACK, i as POPUP, r as TRIGGER, n as TRIGGER_OPEN };
6
+ export { t as FIELD, d as FIELD_WITHIN, r as PICKER_MONTH, i as PICKER_MONTH_ON, n as PICKER_NAV, u as PILL, l as PILL_INDICATOR, c as PILL_TRACK, s as POPUP, o as TRIGGER, a as TRIGGER_OPEN };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Gets the water ready before a switch, e.g. when the pointer or focus reaches
3
+ * the button: its shader is compiled and drawn once, off the page. The GPU
4
+ * driver otherwise finishes that work on the first frame of the first switch,
5
+ * which then hitches.
6
+ */
7
+ export declare function prepareThemeWave(): void;
8
+ /**
9
+ * Changes the theme (`change` swaps the classes or variables) like a drop
10
+ * falling into water at `from` (an element's centre, or a point; the screen's
11
+ * centre by default). Into a light theme, the new theme spreads in a wavy
12
+ * ring; into a dark one, the old theme is pulled into the point. Ripples trail the ring's edge, glinting in the
13
+ * theme's glow colours, and the edge shimmers like a soap film. The water is
14
+ * drawn on the GPU, over the page, which itself doesn't bend. Without a GPU
15
+ * (lite graphics, or no WebGL), without view transitions, or with reduced
16
+ * motion (the OS setting or html.reduce-motion), the theme just changes: drawn
17
+ * on the CPU, even a plain full-screen circle stutters. Call prepareThemeWave
18
+ * when the pointer or focus reaches the switch, so the first switch is smooth.
19
+ */
20
+ export declare function themeWave(change: () => void, from?: Element | {
21
+ x: number;
22
+ y: number;
23
+ } | null): void;
24
+ //# sourceMappingURL=theme-wave.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-wave.d.ts","sourceRoot":"","sources":["../../packages/utils/theme-wave.ts"],"names":[],"mappings":"AA+MA;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,IAAI,CA0HpG"}
@@ -0,0 +1,219 @@
1
+ "use client";
2
+ import { applyGraphicsMode as e } from "./graphics.js";
3
+ import { oklchToLinearRgb as t } from "./theme.js";
4
+ //#region packages/utils/theme-wave.ts
5
+ var n = 1330, r = [
6
+ .25,
7
+ .55,
8
+ .35,
9
+ 1
10
+ ], i = 1050, a = [
11
+ .55,
12
+ 0,
13
+ .85,
14
+ .35
15
+ ], o = .05, s = 36, c = [
16
+ [
17
+ 3,
18
+ 1.9,
19
+ .5
20
+ ],
21
+ [
22
+ 5,
23
+ -2.7,
24
+ .3
25
+ ],
26
+ [
27
+ 8,
28
+ 4.1,
29
+ .2
30
+ ]
31
+ ], l = 48, u = 72, d = "zen-theme-waving", f = "zen-theme-closing", p = "zen-theme-water", m = 0;
32
+ function h([e, t, n, r], i) {
33
+ let a = (e, t, n) => 3 * e * n * (1 - n) ** 2 + 3 * t * n ** 2 * (1 - n) + n ** 3, o = 0, s = 1;
34
+ for (let t = 0; t < 24; t++) {
35
+ let t = (o + s) / 2;
36
+ a(e, n, t) < i ? o = t : s = t;
37
+ }
38
+ return a(t, r, (o + s) / 2);
39
+ }
40
+ function g(e, t, n, r) {
41
+ return Math.min(s, o * t) * c.reduce((t, [i, a, o], s) => t + o * Math.sin(i * e + a * n + r * (s + 1)), 0);
42
+ }
43
+ var _ = `
44
+ precision highp float;
45
+ uniform vec2 res;
46
+ uniform float dpr;
47
+ uniform vec2 from;
48
+ uniform float time;
49
+ uniform float seed;
50
+ uniform float strength;
51
+ // 1 while the edge spreads out, -1 while it closes in.
52
+ uniform float dir;
53
+ uniform float edge;
54
+ uniform float prism;
55
+ uniform vec3 aurora[3];
56
+ uniform float light;
57
+
58
+ float wobble(float a, float r) {
59
+ float size = min(${s.toFixed(1)}, ${o.toFixed(3)} * r);
60
+ return size * (${c.map(([e, t, n], r) => `${n.toFixed(2)} * sin(${e.toFixed(1)} * a + ${t.toFixed(2)} * time + seed * ${(r + 1).toFixed(1)})`).join(" + ")});
61
+ }
62
+
63
+ // A train of ripples whose front is x px away (ahead of it when positive, as it moves):
64
+ // a steep front, crests fading out behind it, and running outwards through
65
+ // the train faster than it spreads, as on water.
66
+ float ripples(float x, float wavelength) {
67
+ float k = 6.2832 / wavelength;
68
+ float reach = x < 0.0 ? 2.5 * wavelength : 0.35 * wavelength;
69
+ return exp(-x * x / (2.0 * reach * reach)) * cos(k * x - 7.0 * time) / k;
70
+ }
71
+
72
+ float height(vec2 p, float a) {
73
+ return strength * ripples(dir * (distance(p, from) - edge - wobble(a, edge)), 20.0 + 0.02 * edge);
74
+ }
75
+
76
+ // Light from the top left. A glint off a surface of this slope, bent a little
77
+ // more or less for each colour, so glints split into a rainbow at their edges.
78
+ const vec3 LIGHT = vec3(-0.45, -0.55, 0.7);
79
+ float glint(vec2 slope, float bend) {
80
+ vec3 n = normalize(vec3(-slope * bend, 1.0));
81
+ vec3 mid = normalize(normalize(LIGHT) + vec3(0.0, 0.0, 1.0));
82
+ return max(0.0, pow(max(dot(n, mid), 0.0), 40.0) - pow(mid.z, 40.0));
83
+ }
84
+
85
+ void main() {
86
+ vec2 p = vec2(gl_FragCoord.x, res.y - gl_FragCoord.y) / dpr;
87
+ vec2 v = p - from;
88
+ float a = atan(v.y, v.x);
89
+ float h = height(p, a);
90
+ vec2 slope = 0.9 * vec2(height(p + vec2(1.0, 0.0), a) - h, height(p + vec2(0.0, 1.0), a) - h);
91
+
92
+ // Aurora: the glow colours, drifting round the circle.
93
+ float hue = fract(a / 6.2832 + 0.15 * time + length(v) * 0.0008) * 3.0;
94
+ vec3 tint = hue < 1.0 ? mix(aurora[0], aurora[1], hue)
95
+ : hue < 2.0 ? mix(aurora[1], aurora[2], hue - 1.0)
96
+ : mix(aurora[2], aurora[0], hue - 2.0);
97
+
98
+ // How far from the edge (outside it when positive).
99
+ float e = length(v) - edge - wobble(a, edge);
100
+ // Iridescence, as on a soap film: the colour turns with the film's thickness,
101
+ // which swells and thins round the ring and over time, slowly, and in soft
102
+ // colours: nothing flickers, or flashes saturated colour (photosensitivity).
103
+ float film = 0.02 * e + 0.35 * sin(2.0 * a + 0.6 * time + seed) + 0.25 * sin(5.0 * a - 0.9 * time) + 0.25 * time;
104
+ vec3 sheen = mix(mix(tint, 0.5 + 0.5 * cos(6.2832 * (film + vec3(0.0, 0.33, 0.67))), 0.5), vec3(1.0), 0.2);
105
+
106
+ vec3 spark = vec3(glint(slope, 0.8), glint(slope, 1.0), glint(slope, 1.2));
107
+ // Slopes facing the light are lit, the others shaded.
108
+ float facing = dot(normalize(vec3(-slope, 1.0)), normalize(LIGHT)) - normalize(LIGHT).z;
109
+ vec3 color = 1.6 * spark * mix(vec3(1.0), mix(tint, sheen, 0.6), mix(0.4, 0.85, light)) + 0.6 * max(facing, 0.0) * tint;
110
+ float shade = mix(0.7, 0.45, light) * max(-facing, 0.0);
111
+
112
+ // The edge: a band of sheen with a bright core, and the aurora trailing behind.
113
+ color += prism * (0.9 * sheen * exp(-e * e / 160.0) + 0.5 * exp(-e * e / 6.0));
114
+ color += prism * 0.45 * tint * exp(-(e + 28.0 * dir) * (e + 28.0 * dir) / 1800.0);
115
+
116
+ color = clamp(color, 0.0, 1.0);
117
+ float cover = max(color.r, max(color.g, color.b));
118
+ gl_FragColor = vec4(color, cover + shade * (1.0 - cover));
119
+ }`, v = "attribute vec2 at; void main() { gl_Position = vec4(at, 0.0, 1.0); }", y;
120
+ function b() {
121
+ if (y !== void 0) return y;
122
+ y = null;
123
+ let e = document.createElement("canvas");
124
+ e.setAttribute("aria-hidden", "true"), e.style.cssText = `position:fixed;inset:0;width:100%;height:100%;pointer-events:none;z-index:2147483647;view-transition-name:${p}`;
125
+ let t = e.getContext("webgl", {
126
+ premultipliedAlpha: !0,
127
+ antialias: !1
128
+ }), n = t?.createProgram();
129
+ if (!t || !n) return null;
130
+ for (let [e, r] of [[t.VERTEX_SHADER, v], [t.FRAGMENT_SHADER, _]]) {
131
+ let i = t.createShader(e);
132
+ if (!i) return null;
133
+ t.shaderSource(i, r), t.compileShader(i), t.attachShader(n, i);
134
+ }
135
+ if (t.bindAttribLocation(n, 0, "at"), t.linkProgram(n), !t.getProgramParameter(n, t.LINK_STATUS)) return null;
136
+ t.useProgram(n), t.bindBuffer(t.ARRAY_BUFFER, t.createBuffer()), t.bufferData(t.ARRAY_BUFFER, new Float32Array([
137
+ -1,
138
+ -1,
139
+ 3,
140
+ -1,
141
+ -1,
142
+ 3
143
+ ]), t.STATIC_DRAW), t.enableVertexAttribArray(0), t.vertexAttribPointer(0, 2, t.FLOAT, !1, 0, 0);
144
+ let r = /* @__PURE__ */ new Map();
145
+ return y = {
146
+ canvas: e,
147
+ gl: t,
148
+ uniform: (e) => (r.has(e) || r.set(e, t.getUniformLocation(n, e)), r.get(e))
149
+ }, y;
150
+ }
151
+ function x(e) {
152
+ e.gl.clear(e.gl.COLOR_BUFFER_BIT), e.canvas.remove();
153
+ }
154
+ function S(e) {
155
+ return t(e).map((e) => e <= .0031308 ? 12.92 * e : 1.055 * e ** (1 / 2.4) - .055);
156
+ }
157
+ function C() {
158
+ return !(window.matchMedia?.("(prefers-reduced-motion: reduce)").matches || document.documentElement.classList.contains("reduce-motion")) && !!document.startViewTransition && e() !== "lite";
159
+ }
160
+ function w() {
161
+ if (y !== void 0 || !C()) return;
162
+ let e = b();
163
+ e?.gl.drawArrays(e.gl.TRIANGLES, 0, 3);
164
+ }
165
+ function T(e, t) {
166
+ let o = document.documentElement, c = C() ? b() : null;
167
+ if (!c) {
168
+ e();
169
+ return;
170
+ }
171
+ let p = window.innerWidth, _ = window.innerHeight, v = p / 2, y = _ / 2;
172
+ if (t instanceof Element) {
173
+ let e = t.getBoundingClientRect();
174
+ v = e.left + e.width / 2, y = e.top + e.height / 2;
175
+ } else t && ({x: v, y} = t);
176
+ let w = Math.hypot(Math.max(v, p - v), Math.max(y, _ - y)), T = Math.random() * 2 * Math.PI, E = w + s + 2, D = ++m;
177
+ x(c), o.classList.add(d);
178
+ let O = [], k = !1, A = document.startViewTransition(() => {
179
+ e();
180
+ let t = getComputedStyle(o);
181
+ k = Number(t.getPropertyValue("--background").trim().split(" ")[0]) <= .5, o.classList.toggle(f, k);
182
+ let n = t.getPropertyValue("--glow").trim(), [r, i, a] = n.split(" ").map(Number);
183
+ O = [
184
+ n,
185
+ t.getPropertyValue("--glow-2").trim(),
186
+ `${r} ${i} ${(a + 240) % 360}`
187
+ ].flatMap(S), document.body.append(c.canvas);
188
+ });
189
+ A.ready.then(() => {
190
+ let e = k ? i : n, t = (e) => (k ? 1 - h(a, e) : h(r, e)) * E, s = k ? "::view-transition-old(root)" : "::view-transition-new(root)", d = (n) => {
191
+ let r = t(n), i = n * e / 1e3;
192
+ return `polygon(${Array.from({ length: u }, (e, t) => {
193
+ let n = t / u * 2 * Math.PI, a = Math.max(0, r + g(n, r, i, T));
194
+ return `${(v + a * Math.cos(n)).toFixed(1)}px ${(y + a * Math.sin(n)).toFixed(1)}px`;
195
+ }).join(",")})`;
196
+ }, f = Array.from({ length: 49 }, (e, t) => ({
197
+ clipPath: d(t / l),
198
+ offset: t / l
199
+ })), b = o.animate(f, {
200
+ duration: e,
201
+ pseudoElement: s,
202
+ fill: "forwards"
203
+ });
204
+ A.finished.finally(() => b.cancel());
205
+ let { canvas: S, gl: C, uniform: w } = c, j = Math.min(window.devicePixelRatio || 1, 2);
206
+ S.width = Math.round(p * j), S.height = Math.round(_ * j), C.viewport(0, 0, S.width, S.height), C.uniform2f(w("res"), S.width, S.height), C.uniform1f(w("dpr"), j), C.uniform2f(w("from"), v, y), C.uniform1f(w("seed"), T), C.uniform3fv(w("aurora[0]"), O), C.uniform1f(w("light"), +!k);
207
+ let M = (e) => (1 - Math.exp(-e * 14)) * (1 - e) ** 1.5, N = () => {
208
+ if (D !== m) return;
209
+ if (b.playState === "finished") return x(c);
210
+ let n = Math.min(1, Number(b.currentTime ?? 0) / e), r = t(n), i = Math.min(1, (1 - n) / .12), a, o;
211
+ k ? (a = 1.6 * n * Math.sqrt(1 - n) * i, o = Math.min(1, n * 4) * Math.min(1, r / 24) * i) : (a = M(n) * i, o = Math.min(1, r / 40) * (1 - n ** 3) * i), C.uniform1f(w("time"), n * e / 1e3), C.uniform1f(w("edge"), r), C.uniform1f(w("dir"), k ? -1 : 1), C.uniform1f(w("strength"), a), C.uniform1f(w("prism"), o), C.drawArrays(C.TRIANGLES, 0, 3), requestAnimationFrame(N);
212
+ };
213
+ N();
214
+ }).catch(() => {}), A.finished.finally(() => {
215
+ D === m && (o.classList.remove(d, f), x(c));
216
+ });
217
+ }
218
+ //#endregion
219
+ export { w as prepareThemeWave, T as themeWave };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Type to jump, as in a native list: keys typed quickly in a row search
3
+ * together. Returns what's been typed so far (lower case) when the key is a
4
+ * letter or digit, else null; match it against the start of each item's label.
5
+ */
6
+ export declare function useTypeahead(): (e: {
7
+ key: string;
8
+ ctrlKey: boolean;
9
+ metaKey: boolean;
10
+ altKey: boolean;
11
+ }) => string | null;
12
+ //# sourceMappingURL=typeahead.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeahead.d.ts","sourceRoot":"","sources":["../../packages/utils/typeahead.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,CAAC,CAAC,EAAE;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACnB,KAAK,MAAM,GAAG,IAAI,CASlB"}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { useRef as e } from "react";
3
+ //#region packages/utils/typeahead.ts
4
+ function t() {
5
+ let t = e({
6
+ text: "",
7
+ at: 0
8
+ });
9
+ return (e) => {
10
+ if (e.key.length !== 1 || e.ctrlKey || e.metaKey || e.altKey) return null;
11
+ let n = Date.now(), r = (n - t.current.at < 700 ? t.current.text : "") + e.key.toLowerCase();
12
+ return t.current = {
13
+ text: r,
14
+ at: n
15
+ }, r;
16
+ };
17
+ }
18
+ //#endregion
19
+ export { t as useTypeahead };
@@ -1,4 +1,4 @@
1
- import { CSSProperties } from 'react';
1
+ import { CSSProperties, RefObject } from 'react';
2
2
  /**
3
3
  * A popup anchored to a trigger, on the native Popover API: opens below the
4
4
  * trigger (flipping above if there's no room), closes on outside click and
@@ -10,26 +10,41 @@ export declare function useAnchoredPopup<T extends HTMLElement = HTMLDivElement>
10
10
  open: boolean;
11
11
  setOpen: (next: boolean) => void;
12
12
  triggerProps: {
13
+ 'data-zen-anchor': string;
14
+ style: CSSProperties;
13
15
  popoverTarget: string;
14
16
  'aria-expanded': boolean;
15
17
  'aria-controls': string;
16
18
  'data-popup-open': true | undefined;
17
- style: CSSProperties;
18
19
  };
19
20
  popupProps: {
20
- ref: import('react').RefObject<T | null>;
21
+ ref: RefObject<T | null>;
21
22
  id: string;
22
23
  popover: "auto";
23
24
  style: CSSProperties;
24
25
  };
25
- popupRef: import('react').RefObject<T | null>;
26
+ popupRef: RefObject<T | null>;
27
+ };
28
+ /** Makes an element the anchor its popup (`id`) is placed against. Spread it on the trigger. */
29
+ export declare function anchorFor(id: string): {
30
+ 'data-zen-anchor': string;
31
+ style: CSSProperties;
26
32
  };
27
33
  /**
28
34
  * The popup's position: below the trigger (above it if there's no room below),
29
- * lined up with its start or end edge, or centred on it. For parts that take
30
- * their own `align`/`offset` (PopoverContent, MenuContent).
35
+ * lined up with its start or end edge, or centred on it; `width` makes it as
36
+ * wide as the trigger, or at least as wide. For parts that take their own
37
+ * `align`/`offset` (PopoverContent, MenuContent). The same choices are kept as
38
+ * custom properties, for placing it where anchor positioning isn't supported.
31
39
  */
32
- export declare function anchoredStyle(id: string, { align, offset, matchWidth }?: Omit<AnchoredPopupOptions, 'onOpenChange'>): CSSProperties;
40
+ export declare function anchoredStyle(id: string, { align, offset, width }?: AnchorOptions): CSSProperties;
41
+ interface AnchorOptions {
42
+ align?: 'start' | 'end' | 'center';
43
+ offset?: number;
44
+ width?: 'match' | 'at-least';
45
+ }
46
+ /** Places the popup in `ref` against its trigger while it's open, where the browser can't. */
47
+ export declare function useAnchorFallback(ref: RefObject<HTMLElement | null>): void;
33
48
  export interface AnchoredPopupOptions {
34
49
  /** Line the popup up with the trigger's start (default) or end edge, or centre it. */
35
50
  align?: 'start' | 'end' | 'center';
@@ -39,4 +54,5 @@ export interface AnchoredPopupOptions {
39
54
  matchWidth?: boolean;
40
55
  onOpenChange?: (open: boolean) => void;
41
56
  }
57
+ export {};
42
58
  //# sourceMappingURL=useAnchoredPopup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAnchoredPopup.d.ts","sourceRoot":"","sources":["../../packages/utils/useAnchoredPopup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAmD,MAAM,OAAO,CAAC;AAEvF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EAAE,EACrE,KAAe,EACf,MAAU,EACV,UAAkB,EAClB,YAAY,GACf,GAAE,oBAAyB;;;oBAgBb,OAAO;;;;;;eA4BsB,aAAa;;;;;;;;;EAWxD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CACzB,EAAE,EAAE,MAAM,EACV,EAAE,KAAe,EAAE,MAAU,EAAE,UAAkB,EAAE,GAAE,IAAI,CAAC,oBAAoB,EAAE,cAAc,CAAM,GACrG,aAAa,CAcf;AAED,MAAM,WAAW,oBAAoB;IACjC,sFAAsF;IACtF,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IACnC,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C"}
1
+ {"version":3,"file":"useAnchoredPopup.d.ts","sourceRoot":"","sources":["../../packages/utils/useAnchoredPopup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAmD,MAAM,OAAO,CAAC;AAElG;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EAAE,EACrE,KAAe,EACf,MAAU,EACV,UAAkB,EAClB,YAAY,GACf,GAAE,oBAAyB;;;oBAgBb,OAAO;;;eA6CkD,aAAa;;;;;;;;;;;;;EAJpF;AAED,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM;;WACoC,aAAa;EACpF;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,KAAe,EAAE,MAAU,EAAE,KAAK,EAAE,GAAE,aAAkB,GAAG,aAAa,CAoBnH;AAED,UAAU,aAAa;IACnB,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CAChC;AAYD,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,QAiCnE;AAmCD,MAAM,WAAW,oBAAoB;IACjC,sFAAsF;IACtF,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IACnC,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C"}
@@ -1,50 +1,56 @@
1
1
  "use client";
2
2
  import { useCallback as e, useEffect as t, useId as n, useRef as r, useState as i } from "react";
3
3
  //#region packages/utils/useAnchoredPopup.ts
4
- function a({ align: a = "start", offset: s = 4, matchWidth: c = !1, onOpenChange: l } = {}) {
5
- let u = `zen__popup-${n().replace(/[^\w-]/g, "")}`, d = r(null), [f, p] = i(!1), m = r(l);
6
- m.current = l;
7
- let h = r(!1), g = e((e) => {
8
- p(e), h.current !== e && (h.current = e, m.current?.(e));
9
- }, []), _ = e((e) => {
10
- let t = d.current;
4
+ function a({ align: a = "start", offset: c = 4, matchWidth: l = !1, onOpenChange: d } = {}) {
5
+ let f = `zen__popup-${n().replace(/[^\w-]/g, "")}`, p = r(null), [m, h] = i(!1), g = r(d);
6
+ g.current = d;
7
+ let _ = r(!1), v = e((e) => {
8
+ h(e), _.current !== e && (_.current = e, g.current?.(e));
9
+ }, []), y = e((e) => {
10
+ let t = p.current;
11
11
  if (t) {
12
12
  try {
13
13
  e ? t.showPopover?.() : t.hidePopover?.();
14
14
  } catch {}
15
- g(e);
15
+ v(e);
16
16
  }
17
- }, [g]);
18
- return t(() => {
19
- let e = d.current;
17
+ }, [v]);
18
+ return u(p), t(() => {
19
+ let e = p.current;
20
20
  if (!e) return;
21
- let t = (e) => g(e.newState === "open");
21
+ let t = (e) => v(e.newState === "open");
22
22
  return e.addEventListener("toggle", t), () => e.removeEventListener("toggle", t);
23
- }, [g]), {
24
- id: u,
25
- open: f,
26
- setOpen: _,
23
+ }, [v]), {
24
+ id: f,
25
+ open: m,
26
+ setOpen: y,
27
27
  triggerProps: {
28
- popoverTarget: u,
29
- "aria-expanded": f,
30
- "aria-controls": u,
31
- "data-popup-open": f || void 0,
32
- style: { anchorName: `--${u}` }
28
+ popoverTarget: f,
29
+ "aria-expanded": m,
30
+ "aria-controls": f,
31
+ "data-popup-open": m || void 0,
32
+ ...o(f)
33
33
  },
34
34
  popupProps: {
35
- ref: d,
36
- id: u,
35
+ ref: p,
36
+ id: f,
37
37
  popover: "auto",
38
- style: o(u, {
38
+ style: s(f, {
39
39
  align: a,
40
- offset: s,
41
- matchWidth: c
40
+ offset: c,
41
+ width: l ? "at-least" : void 0
42
42
  })
43
43
  },
44
- popupRef: d
44
+ popupRef: p
45
45
  };
46
46
  }
47
- function o(e, { align: t = "start", offset: n = 4, matchWidth: r = !1 } = {}) {
47
+ function o(e) {
48
+ return {
49
+ "data-zen-anchor": e,
50
+ style: { anchorName: `--${e}` }
51
+ };
52
+ }
53
+ function s(e, { align: t = "start", offset: n = 4, width: r } = {}) {
48
54
  let i = {
49
55
  start: "block-end span-inline-end",
50
56
  end: "block-end span-inline-start",
@@ -56,8 +62,58 @@ function o(e, { align: t = "start", offset: n = 4, matchWidth: r = !1 } = {}) {
56
62
  positionTryFallbacks: "flip-block",
57
63
  inset: "auto",
58
64
  margin: `${n}px 0`,
59
- ...r && { minWidth: "anchor-size(width)" }
65
+ ...r === "at-least" && {
66
+ width: "max-content",
67
+ minWidth: "anchor-size(width)"
68
+ },
69
+ ...r === "match" && {
70
+ width: "anchor-size(width)",
71
+ minWidth: 0
72
+ },
73
+ "--zen-anchor": e,
74
+ "--zen-anchor-align": t,
75
+ "--zen-anchor-offset": n,
76
+ "--zen-anchor-width": r ?? "auto"
60
77
  };
61
78
  }
79
+ var c, l = () => c ??= typeof CSS < "u" && !!CSS.supports?.("position-area: block-end");
80
+ function u(e) {
81
+ t(() => {
82
+ let t = e.current;
83
+ if (!t || l()) return;
84
+ let n = 0, r = () => {
85
+ n ||= requestAnimationFrame(() => {
86
+ n = 0, f(t);
87
+ });
88
+ }, i = typeof ResizeObserver > "u" ? null : new ResizeObserver(r), a = () => {
89
+ window.removeEventListener("scroll", r, { capture: !0 }), window.removeEventListener("resize", r), i?.disconnect(), cancelAnimationFrame(n), n = 0;
90
+ }, o = (e) => {
91
+ a(), e.newState === "open" && (f(t), window.addEventListener("scroll", r, {
92
+ capture: !0,
93
+ passive: !0
94
+ }), window.addEventListener("resize", r, { passive: !0 }), i?.observe(t));
95
+ };
96
+ return t.addEventListener("toggle", o), () => {
97
+ t.removeEventListener("toggle", o), a();
98
+ };
99
+ }, [e]);
100
+ }
101
+ var d = 8;
102
+ function f(e) {
103
+ let t = e.style.getPropertyValue("--zen-anchor").trim(), n = t ? document.querySelector(`[data-zen-anchor="${t}"]`) : null;
104
+ if (!n) return;
105
+ let r = e.style.getPropertyValue("--zen-anchor-align").trim() || "start", i = Number(e.style.getPropertyValue("--zen-anchor-offset")) || 0, a = e.style.getPropertyValue("--zen-anchor-width").trim(), o = n.getBoundingClientRect(), s = e.style;
106
+ for (let e of [
107
+ "position-anchor",
108
+ "position-area",
109
+ "position-try-fallbacks"
110
+ ]) s.removeProperty(e);
111
+ s.inset = "0 auto auto 0", s.margin = "0", a === "match" && (s.width = `${o.width}px`), a === "at-least" && (s.minWidth = `${o.width}px`);
112
+ let c = {
113
+ width: e.offsetWidth,
114
+ height: e.offsetHeight
115
+ }, l = document.documentElement.clientWidth, u = window.innerHeight, f = o.bottom + i, p = o.top - i - c.height, m = f + c.height > u - d && p >= d ? p : f, h = getComputedStyle(n).direction === "rtl", g = h ? o.right - c.width : o.left, _ = h ? o.left : o.right - c.width, v = r === "center" ? o.left + (o.width - c.width) / 2 : r === "end" ? _ : g;
116
+ s.top = `${m}px`, s.left = `${Math.max(d, Math.min(v, l - c.width - d))}px`;
117
+ }
62
118
  //#endregion
63
- export { o as anchoredStyle, a as useAnchoredPopup };
119
+ export { o as anchorFor, s as anchoredStyle, u as useAnchorFallback, a as useAnchoredPopup };