@nsaa/core 0.1.0-alpha.0 → 0.1.0-alpha.2

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 (238) hide show
  1. package/dist/accordion/accordion.d.ts +7 -0
  2. package/dist/accordion/accordion.js +54 -0
  3. package/dist/accordion/index.d.ts +3 -0
  4. package/dist/alert/alert.d.ts +18 -0
  5. package/dist/alert/alert.js +53 -0
  6. package/dist/alert/index.d.ts +3 -0
  7. package/dist/alert-dialog/alert-dialog.d.ts +19 -0
  8. package/dist/alert-dialog/alert-dialog.js +100 -0
  9. package/dist/alert-dialog/index.d.ts +3 -0
  10. package/dist/avatar/avatar.d.ts +12 -0
  11. package/dist/avatar/avatar.js +50 -0
  12. package/dist/avatar/index.d.ts +3 -0
  13. package/dist/badge/badge.d.ts +8 -0
  14. package/dist/badge/badge.js +29 -0
  15. package/dist/badge/index.d.ts +3 -0
  16. package/dist/button/button.d.ts +25 -0
  17. package/dist/button/button.js +136 -0
  18. package/dist/button/index.d.ts +3 -0
  19. package/dist/calendar/calendar.d.ts +11 -0
  20. package/dist/calendar/calendar.js +131 -0
  21. package/dist/calendar/index.d.ts +3 -0
  22. package/dist/card/card.d.ts +12 -0
  23. package/dist/card/card.js +55 -0
  24. package/dist/card/index.d.ts +3 -0
  25. package/dist/checkbox/checkbox.d.ts +4 -0
  26. package/dist/checkbox/checkbox.js +35 -0
  27. package/dist/checkbox/index.d.ts +3 -0
  28. package/dist/collapsible/collapsible.d.ts +6 -0
  29. package/dist/collapsible/collapsible.js +24 -0
  30. package/dist/collapsible/index.d.ts +3 -0
  31. package/dist/combobox/combobox.d.ts +27 -0
  32. package/dist/combobox/combobox.js +226 -0
  33. package/dist/combobox/index.d.ts +3 -0
  34. package/dist/command/command.d.ts +20 -0
  35. package/dist/command/command.js +116 -0
  36. package/dist/command/index.d.ts +3 -0
  37. package/dist/context-menu/context-menu.d.ts +30 -0
  38. package/dist/context-menu/context-menu.js +173 -0
  39. package/dist/context-menu/index.d.ts +3 -0
  40. package/dist/dialog/dialog.d.ts +18 -0
  41. package/dist/dialog/dialog.js +106 -0
  42. package/dist/dialog/index.d.ts +3 -0
  43. package/dist/direction.d.ts +3 -0
  44. package/dist/direction.js +2 -0
  45. package/dist/drawer/drawer.d.ts +17 -0
  46. package/dist/drawer/drawer.js +136 -0
  47. package/dist/drawer/index.d.ts +3 -0
  48. package/dist/dropdown-menu/dropdown-menu.d.ts +30 -0
  49. package/dist/dropdown-menu/dropdown-menu.js +177 -0
  50. package/dist/dropdown-menu/index.d.ts +3 -0
  51. package/dist/empty/empty.d.ts +35 -0
  52. package/dist/empty/empty.js +93 -0
  53. package/dist/empty/index.d.ts +3 -0
  54. package/dist/field/field.d.ts +26 -0
  55. package/dist/field/field.js +109 -0
  56. package/dist/field/index.d.ts +3 -0
  57. package/dist/index.d.ts +89 -631
  58. package/dist/index.js +49 -3527
  59. package/dist/input/index.d.ts +3 -0
  60. package/dist/input/input.d.ts +4 -0
  61. package/dist/input/input.js +14 -0
  62. package/dist/input-group/index.d.ts +3 -0
  63. package/dist/input-group/input-group.d.ts +19 -0
  64. package/dist/input-group/input-group.js +78 -0
  65. package/dist/input-otp/index.d.ts +3 -0
  66. package/dist/input-otp/input-otp.d.ts +12 -0
  67. package/dist/input-otp/input-otp.js +73 -0
  68. package/dist/kbd/index.d.ts +3 -0
  69. package/dist/kbd/kbd.d.ts +5 -0
  70. package/dist/kbd/kbd.js +19 -0
  71. package/dist/label/index.d.ts +3 -0
  72. package/dist/label/label.d.ts +4 -0
  73. package/dist/label/label.js +13 -0
  74. package/dist/legacy/icon-button/icon-swap.js +58 -0
  75. package/dist/lib/cn.d.ts +3 -0
  76. package/dist/{cn-DxFBFdwT.js → lib/cn.js} +1 -1
  77. package/dist/lib/control-defaults.js +8 -0
  78. package/dist/lib/icon-swap.d.ts +15 -0
  79. package/dist/lib/icon-swap.js +26 -0
  80. package/dist/lib/input-modality.js +39 -0
  81. package/dist/lib/merge-refs.js +21 -0
  82. package/dist/lib/shortcut.js +50 -0
  83. package/dist/lib/track-input-modality.d.ts +2 -0
  84. package/dist/lib/track-input-modality.js +4 -0
  85. package/dist/lib/tv.js +7 -0
  86. package/dist/lib/use-press.js +48 -0
  87. package/dist/lib/user-action.js +13 -0
  88. package/dist/loaders/arc.d.ts +6 -0
  89. package/dist/loaders/arc.js +31 -0
  90. package/dist/loaders/atom.d.ts +5 -0
  91. package/dist/loaders/atom.js +70 -0
  92. package/dist/loaders/blocks.d.ts +8 -0
  93. package/dist/loaders/blocks.js +74 -0
  94. package/dist/loaders/bouncing-dots.d.ts +3 -0
  95. package/dist/loaders/bouncing-dots.js +45 -0
  96. package/dist/loaders/cap.d.ts +6 -0
  97. package/dist/loaders/cap.js +7 -0
  98. package/dist/loaders/cascade.d.ts +5 -0
  99. package/dist/loaders/cascade.js +50 -0
  100. package/dist/loaders/circular-dots.d.ts +3 -0
  101. package/dist/loaders/circular-dots.js +40 -0
  102. package/dist/loaders/classic-v2.d.ts +3 -0
  103. package/dist/loaders/classic-v2.js +41 -0
  104. package/dist/loaders/classic.d.ts +3 -0
  105. package/dist/loaders/classic.js +48 -0
  106. package/dist/loaders/clock.d.ts +5 -0
  107. package/dist/loaders/clock.js +31 -0
  108. package/dist/loaders/comet.d.ts +5 -0
  109. package/dist/loaders/comet.js +52 -0
  110. package/dist/loaders/compass.d.ts +3 -0
  111. package/dist/loaders/compass.js +39 -0
  112. package/dist/loaders/dual.d.ts +6 -0
  113. package/dist/loaders/dual.js +47 -0
  114. package/dist/loaders/easing.d.ts +6 -0
  115. package/dist/loaders/easing.js +34 -0
  116. package/dist/loaders/eclipse.d.ts +3 -0
  117. package/dist/loaders/eclipse.js +69 -0
  118. package/dist/loaders/fade.js +28 -0
  119. package/dist/loaders/flip.d.ts +3 -0
  120. package/dist/loaders/flip.js +41 -0
  121. package/dist/{frame-CK9IBOZB.js → loaders/frame.js} +2 -50
  122. package/dist/loaders/gather.d.ts +3 -0
  123. package/dist/loaders/gather.js +85 -0
  124. package/dist/loaders/leap.d.ts +3 -0
  125. package/dist/loaders/leap.js +67 -0
  126. package/dist/loaders/linear-dots.d.ts +3 -0
  127. package/dist/loaders/linear-dots.js +54 -0
  128. package/dist/loaders/loading.d.ts +3 -0
  129. package/dist/loaders/loading.js +64 -0
  130. package/dist/loaders/morph.d.ts +3 -0
  131. package/dist/loaders/morph.js +40 -0
  132. package/dist/loaders/motion.d.ts +35 -0
  133. package/dist/loaders/motion.js +51 -0
  134. package/dist/loaders/orbit.d.ts +5 -0
  135. package/dist/loaders/orbit.js +44 -0
  136. package/dist/loaders/pulse.d.ts +3 -0
  137. package/dist/loaders/pulse.js +52 -0
  138. package/dist/loaders/radar.d.ts +5 -0
  139. package/dist/loaders/radar.js +64 -0
  140. package/dist/loaders/ring.d.ts +6 -0
  141. package/dist/loaders/ring.js +38 -0
  142. package/dist/loaders/ripple.d.ts +8 -0
  143. package/dist/loaders/ripple.js +57 -0
  144. package/dist/loaders/slide.d.ts +3 -0
  145. package/dist/loaders/slide.js +74 -0
  146. package/dist/loaders/snake.d.ts +6 -0
  147. package/dist/loaders/snake.js +59 -0
  148. package/dist/loaders/spinners.d.ts +61 -0
  149. package/dist/loaders/spinners.js +63 -0
  150. package/dist/loaders/swirl.d.ts +3 -0
  151. package/dist/loaders/swirl.js +50 -0
  152. package/dist/loaders/text/shared.js +25 -0
  153. package/dist/loaders/text/text-loaders.d.ts +48 -0
  154. package/dist/loaders/text/text-loaders.js +723 -0
  155. package/dist/loaders/trace.d.ts +6 -0
  156. package/dist/loaders/trace.js +46 -0
  157. package/dist/loaders/types.d.ts +10 -0
  158. package/dist/loaders/wave.d.ts +8 -0
  159. package/dist/loaders/wave.js +59 -0
  160. package/dist/loaders-text.d.ts +2 -47
  161. package/dist/loaders-text.js +1 -743
  162. package/dist/loaders.d.ts +36 -132
  163. package/dist/loaders.js +35 -1096
  164. package/dist/native-select/index.d.ts +3 -0
  165. package/dist/native-select/native-select.d.ts +9 -0
  166. package/dist/native-select/native-select.js +44 -0
  167. package/dist/pagination/index.d.ts +3 -0
  168. package/dist/pagination/pagination.d.ts +18 -0
  169. package/dist/pagination/pagination.js +134 -0
  170. package/dist/popover/index.d.ts +3 -0
  171. package/dist/popover/popover.d.ts +10 -0
  172. package/dist/popover/popover.js +54 -0
  173. package/dist/radio-group/index.d.ts +3 -0
  174. package/dist/radio-group/radio-group.d.ts +6 -0
  175. package/dist/radio-group/radio-group.js +33 -0
  176. package/dist/select/index.d.ts +3 -0
  177. package/dist/select/select.d.ts +16 -0
  178. package/dist/select/select.js +148 -0
  179. package/dist/separator/index.d.ts +3 -0
  180. package/dist/separator/separator.d.ts +4 -0
  181. package/dist/separator/separator.js +15 -0
  182. package/dist/skeleton/index.d.ts +3 -0
  183. package/dist/skeleton/skeleton.d.ts +10 -0
  184. package/dist/skeleton/skeleton.js +24 -0
  185. package/dist/slider/index.d.ts +3 -0
  186. package/dist/slider/slider.d.ts +4 -0
  187. package/dist/slider/slider.js +39 -0
  188. package/dist/sound/sound-map.d.ts +70 -0
  189. package/dist/sound/sound-map.js +72 -0
  190. package/dist/sound/sound.d.ts +38 -0
  191. package/dist/sound/sound.js +136 -0
  192. package/dist/sound/uisfx.d.ts +37 -0
  193. package/dist/sound/uisfx.js +59 -0
  194. package/dist/sound-uisfx.d.ts +2 -37
  195. package/dist/sound-uisfx.js +1 -58
  196. package/dist/spinner/index.d.ts +5 -0
  197. package/dist/spinner/loader-provider.d.ts +16 -0
  198. package/dist/spinner/loader-provider.js +28 -0
  199. package/dist/spinner/registry.d.ts +9 -0
  200. package/dist/spinner/registry.js +15 -0
  201. package/dist/spinner/spinner.d.ts +26 -0
  202. package/dist/spinner/spinner.js +143 -0
  203. package/dist/switch/index.d.ts +3 -0
  204. package/dist/switch/switch.d.ts +6 -0
  205. package/dist/switch/switch.js +25 -0
  206. package/dist/table/index.d.ts +3 -0
  207. package/dist/table/table.d.ts +17 -0
  208. package/dist/table/table.js +66 -0
  209. package/dist/tabs/index.d.ts +3 -0
  210. package/dist/tabs/tabs.d.ts +11 -0
  211. package/dist/tabs/tabs.js +46 -0
  212. package/dist/textarea/index.d.ts +3 -0
  213. package/dist/textarea/textarea.d.ts +4 -0
  214. package/dist/textarea/textarea.js +12 -0
  215. package/dist/toast/index.d.ts +3 -0
  216. package/dist/toast/toast.d.ts +17 -0
  217. package/dist/toast/toast.js +211 -0
  218. package/dist/toggle-group/index.d.ts +3 -0
  219. package/dist/toggle-group/toggle-group.d.ts +64 -0
  220. package/dist/toggle-group/toggle-group.js +95 -0
  221. package/dist/tokens/dist/motion.d.ts +24 -0
  222. package/dist/{motion-NQq2BA78.js → tokens/dist/motion.js} +1 -1
  223. package/dist/toolbar/index.d.ts +3 -0
  224. package/dist/toolbar/overflow.d.ts +4 -0
  225. package/dist/toolbar/overflow.js +242 -0
  226. package/dist/toolbar/toolbar-item.d.ts +29 -0
  227. package/dist/toolbar/toolbar-item.js +71 -0
  228. package/dist/toolbar/toolbar.d.ts +73 -0
  229. package/dist/toolbar/toolbar.js +250 -0
  230. package/dist/tooltip/index.d.ts +3 -0
  231. package/dist/tooltip/tooltip.d.ts +7 -0
  232. package/dist/tooltip/tooltip.js +41 -0
  233. package/package.json +5 -3
  234. package/src/feel.css +18 -6
  235. package/src/styles.css +19 -1
  236. package/dist/registry-2PyPW9Xw.js +0 -390
  237. package/dist/registry-DjfWNw3R.d.ts +0 -18
  238. package/dist/sound-DiYNAnR_.d.ts +0 -61
@@ -0,0 +1,250 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { ControlDefaultsContext, useControlDefaults } from "../lib/control-defaults.js";
4
+ import { buttonVariants } from "../button/button.js";
5
+ import { Input } from "../input/input.js";
6
+ import { DropdownMenuCheckboxItem, DropdownMenuItem, DropdownMenuShortcut } from "../dropdown-menu/dropdown-menu.js";
7
+ import { tv } from "../lib/tv.js";
8
+ import { ariaShortcut, formatShortcut } from "../lib/shortcut.js";
9
+ import { TooltipProvider } from "../tooltip/tooltip.js";
10
+ import { ToolbarItem } from "./toolbar-item.js";
11
+ import { OverflowContext, OverflowMore, OverflowStore, useOverflowUnit } from "./overflow.js";
12
+ import { mergeRefs } from "../lib/merge-refs.js";
13
+ import { jsx, jsxs } from "react/jsx-runtime";
14
+ import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
15
+ import { Toolbar } from "@base-ui/react/toolbar";
16
+ // src/toolbar/toolbar.tsx
17
+ const toolbarStyles = tv({
18
+ base: "flex items-center gap-0.5 data-[orientation=vertical]:flex-col",
19
+ variants: {
20
+ surface: {
21
+ none: "",
22
+ floating: "nsaa-surface w-fit rounded-surface p-1 shadow-default"
23
+ },
24
+ overflow: {
25
+ menu: "flex-nowrap",
26
+ none: "flex-wrap",
27
+ scroll: [
28
+ "snap-x snap-proximity scroll-px-4 overflow-x-auto overscroll-x-contain p-1 pointer-coarse:py-1.5 [scrollbar-width:none] [&>*]:snap-start",
29
+ "[--fade-l:0px] [--fade-r:0px] data-fade-left:[--fade-l:--spacing(4)] data-fade-right:[--fade-r:--spacing(4)]",
30
+ "[mask-image:linear-gradient(to_right,transparent,black_var(--fade-l),black_calc(100%-var(--fade-r)),transparent)]"
31
+ ]
32
+ }
33
+ },
34
+ defaultVariants: {
35
+ surface: "none",
36
+ overflow: "menu"
37
+ }
38
+ });
39
+ /** Marks which edges of a scrolling toolbar hide items (`data-fade-left` / `data-fade-right`). */
40
+ function useScrollEdges(enabled) {
41
+ const node = useRef(null);
42
+ useEffect(() => {
43
+ const el = node.current;
44
+ if (!enabled || !el) return;
45
+ const update = () => {
46
+ const max = el.scrollWidth - el.clientWidth;
47
+ const fromLeft = getComputedStyle(el).direction === "rtl" ? max + el.scrollLeft : el.scrollLeft;
48
+ el.toggleAttribute("data-fade-left", fromLeft > 1);
49
+ el.toggleAttribute("data-fade-right", max - fromLeft > 1);
50
+ };
51
+ update();
52
+ el.addEventListener("scroll", update, { passive: true });
53
+ const observer = typeof ResizeObserver === "undefined" ? void 0 : new ResizeObserver(update);
54
+ observer?.observe(el);
55
+ return () => {
56
+ el.removeEventListener("scroll", update);
57
+ observer?.disconnect();
58
+ };
59
+ }, [enabled]);
60
+ return node;
61
+ }
62
+ /**
63
+ * Groups related controls behind one Tab stop, with arrow keys, Home and End moving between items
64
+ * (Base UI `Toolbar`). Items get the toolbar's size, swap icons instantly, change colour without
65
+ * transitions and stay silent unless `sound` is set: a toolbar is high-frequency.
66
+ */
67
+ function ToolbarRoot({ size = "sm", surface = "none", overflow = "menu", overflowLabel = "More", sound = false, orientation = "horizontal", className, children, onKeyDown, ref, ...props }) {
68
+ const edges = useScrollEdges(overflow === "scroll");
69
+ const root = useRef(null);
70
+ const setRef = useCallback((el) => mergeRefs(root, edges, ref)(el), [edges, ref]);
71
+ const [store] = useState(() => new OverflowStore());
72
+ const collapses = overflow === "menu" && orientation === "horizontal";
73
+ useLayoutEffect(() => {
74
+ if (collapses && root.current) store.layout(root.current);
75
+ });
76
+ useEffect(() => {
77
+ const el = root.current;
78
+ if (!collapses || !el || typeof ResizeObserver === "undefined") return;
79
+ const observer = new ResizeObserver(() => store.layout(el));
80
+ observer.observe(el);
81
+ if (el.parentElement) observer.observe(el.parentElement);
82
+ return () => observer.disconnect();
83
+ }, [collapses, store]);
84
+ const handleKeyDown = (event) => {
85
+ onKeyDown?.(event);
86
+ if (event.defaultPrevented || event.key !== "Home" && event.key !== "End") return;
87
+ if (event.target.closest("input, textarea, [contenteditable]")) return;
88
+ const items = [...event.currentTarget.querySelectorAll("button:not(:disabled), a[href], input:not(:disabled)")];
89
+ const target = event.key === "Home" ? items[0] : items.at(-1);
90
+ if (!target) return;
91
+ event.preventDefault();
92
+ target.focus();
93
+ };
94
+ return /* @__PURE__ */ jsx(ControlDefaultsContext.Provider, {
95
+ value: {
96
+ size,
97
+ sound,
98
+ orientation,
99
+ iconTransition: "instant",
100
+ instantColors: true
101
+ },
102
+ children: /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsxs(Toolbar.Root, {
103
+ ref: setRef,
104
+ "data-slot": "toolbar",
105
+ "data-size": size,
106
+ "data-surface": surface,
107
+ orientation,
108
+ className: cn(toolbarStyles({
109
+ surface,
110
+ overflow
111
+ }), "data-[orientation=horizontal]:pointer-coarse:[&_:is(button,a)]:before:min-w-0", "data-[orientation=vertical]:pointer-coarse:[&_:is(button,a)]:before:min-h-0", className),
112
+ onKeyDown: handleKeyDown,
113
+ ...props,
114
+ children: [/* @__PURE__ */ jsx(OverflowContext.Provider, {
115
+ value: collapses ? store : null,
116
+ children
117
+ }), collapses && /* @__PURE__ */ jsx(OverflowMore, {
118
+ store,
119
+ label: overflowLabel
120
+ })]
121
+ }) })
122
+ });
123
+ }
124
+ /** A toolbar button's form in the More menu: a menu item, or a checkbox item for a toggle. */
125
+ function buttonMenuItem(p, disabled) {
126
+ const label = p["aria-label"] ?? p.children;
127
+ const shortcut = typeof p.tooltip === "object" ? p.tooltip.shortcut : void 0;
128
+ if (p.pressed !== void 0 || p.onPressedChange !== void 0) return /* @__PURE__ */ jsxs(DropdownMenuCheckboxItem, {
129
+ "aria-keyshortcuts": shortcut ? ariaShortcut(shortcut) : void 0,
130
+ checked: p.pressed ?? false,
131
+ disabled,
132
+ onCheckedChange: (on, details) => p.onPressedChange?.(on, details),
133
+ children: [
134
+ p.icon,
135
+ label,
136
+ shortcut && /* @__PURE__ */ jsx(DropdownMenuShortcut, { children: formatShortcut(shortcut) })
137
+ ]
138
+ });
139
+ return /* @__PURE__ */ jsxs(DropdownMenuItem, {
140
+ "aria-keyshortcuts": shortcut ? ariaShortcut(shortcut) : void 0,
141
+ disabled,
142
+ onClick: p.onClick,
143
+ children: [
144
+ p.icon,
145
+ label,
146
+ shortcut && /* @__PURE__ */ jsx(DropdownMenuShortcut, { children: formatShortcut(shortcut) })
147
+ ]
148
+ });
149
+ }
150
+ /**
151
+ * A ghost Button (#84): icon-only (with a tooltip) when it has only an `icon`, labelled otherwise;
152
+ * a toggle with `pressed`. Disabled items stay focusable so people can discover them.
153
+ */
154
+ function ToolbarButton({ disabled, overflowPriority, ...props }) {
155
+ const trigger = props["aria-haspopup"] !== void 0;
156
+ const { hidden, unitProps, placeholder } = useOverflowUnit({
157
+ kind: "item",
158
+ priority: trigger ? "never" : overflowPriority,
159
+ menu: buttonMenuItem(props, disabled)
160
+ });
161
+ if (hidden) return placeholder;
162
+ return /* @__PURE__ */ jsx(Toolbar.Button, {
163
+ ...unitProps,
164
+ "data-slot": "toolbar-button",
165
+ disabled,
166
+ focusableWhenDisabled: true,
167
+ render: /* @__PURE__ */ jsx(ToolbarItem, { ...props })
168
+ });
169
+ }
170
+ const LINK_SIZE = {
171
+ xs: "xs",
172
+ sm: "sm",
173
+ md: "default",
174
+ lg: "lg",
175
+ xl: "lg"
176
+ };
177
+ /** A link styled like a ghost toolbar item. */
178
+ function ToolbarLink({ className, overflowPriority, ...props }) {
179
+ const { size } = useControlDefaults();
180
+ const { hidden, unitProps, placeholder } = useOverflowUnit({
181
+ kind: "item",
182
+ priority: overflowPriority,
183
+ menu: /* @__PURE__ */ jsx(DropdownMenuItem, {
184
+ render: /* @__PURE__ */ jsx("a", { href: props.href }),
185
+ children: props.children
186
+ })
187
+ });
188
+ if (hidden) return placeholder;
189
+ return /* @__PURE__ */ jsx(Toolbar.Link, {
190
+ ...unitProps,
191
+ "data-slot": "toolbar-link",
192
+ className: cn(buttonVariants({
193
+ variant: "ghost",
194
+ size: LINK_SIZE[size ?? "md"]
195
+ }), "transition-none", className),
196
+ ...props
197
+ });
198
+ }
199
+ /** A labelled cluster of items. */
200
+ function ToolbarGroup({ className, ...props }) {
201
+ return /* @__PURE__ */ jsx(Toolbar.Group, {
202
+ "data-slot": "toolbar-group",
203
+ role: "group",
204
+ className: cn("flex items-center gap-0.5 data-[orientation=vertical]:flex-col", className),
205
+ ...props
206
+ });
207
+ }
208
+ /** 1 px `border-default`, 60% of the item height, perpendicular to the toolbar. */
209
+ function ToolbarSeparator({ className, ...props }) {
210
+ const { hidden, unitProps, placeholder } = useOverflowUnit({
211
+ kind: "separator",
212
+ menu: null
213
+ });
214
+ if (hidden) return placeholder;
215
+ return /* @__PURE__ */ jsx(Toolbar.Separator, {
216
+ ...unitProps,
217
+ "data-slot": "toolbar-separator",
218
+ className: cn("shrink-0 self-stretch bg-border-default", "data-[orientation=vertical]:mx-0.5 data-[orientation=vertical]:w-px data-[orientation=vertical]:scale-y-60", "data-[orientation=horizontal]:my-0.5 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:scale-x-60", className),
219
+ ...props
220
+ });
221
+ }
222
+ /**
223
+ * A text input in the toolbar (search, find, a URL). At most one, placed last: arrow keys move
224
+ * the caret inside it (Base UI). The base-nova Input (#84) without its resting border; never
225
+ * collapses.
226
+ */
227
+ function ToolbarInput({ className, ...props }) {
228
+ const { unitProps } = useOverflowUnit({
229
+ kind: "item",
230
+ priority: "never",
231
+ menu: null
232
+ });
233
+ return /* @__PURE__ */ jsx("span", {
234
+ ...unitProps,
235
+ "data-slot": "toolbar-input",
236
+ className: "inline-flex min-w-0 shrink",
237
+ children: /* @__PURE__ */ jsx(Toolbar.Input, { render: /* @__PURE__ */ jsx(Input, {
238
+ className: cn("border-transparent dark:bg-transparent", className),
239
+ ...props
240
+ }) })
241
+ });
242
+ }
243
+ const Toolbar$1 = Object.assign(ToolbarRoot, {
244
+ Button: ToolbarButton,
245
+ Input: ToolbarInput,
246
+ Link: ToolbarLink,
247
+ Group: ToolbarGroup,
248
+ Separator: ToolbarSeparator
249
+ });
250
+ export { Toolbar$1 as Toolbar };
@@ -0,0 +1,3 @@
1
+
2
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./tooltip.js";
3
+ export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
@@ -0,0 +1,7 @@
1
+
2
+ import { Tooltip } from "@base-ui/react/tooltip";
3
+ declare function TooltipProvider({ delay, ...props }: Tooltip.Provider.Props): import("react").JSX.Element;
4
+ declare function Tooltip$1({ ...props }: Tooltip.Root.Props): import("react").JSX.Element;
5
+ declare function TooltipTrigger({ ...props }: Tooltip.Trigger.Props): import("react").JSX.Element;
6
+ declare function TooltipContent({ className, side, sideOffset, align, alignOffset, children, ...props }: Tooltip.Popup.Props & Pick<Tooltip.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset">): import("react").JSX.Element;
7
+ export { Tooltip$1 as Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
@@ -0,0 +1,41 @@
1
+ "use client";
2
+ "use client";
3
+ import { cn } from "../lib/cn.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Tooltip } from "@base-ui/react/tooltip";
6
+ // src/tooltip/tooltip.tsx
7
+ function TooltipProvider({ delay = 600, ...props }) {
8
+ return /* @__PURE__ */ jsx(Tooltip.Provider, {
9
+ "data-slot": "tooltip-provider",
10
+ delay,
11
+ ...props
12
+ });
13
+ }
14
+ function Tooltip$1({ ...props }) {
15
+ return /* @__PURE__ */ jsx(Tooltip.Root, {
16
+ "data-slot": "tooltip",
17
+ ...props
18
+ });
19
+ }
20
+ function TooltipTrigger({ ...props }) {
21
+ return /* @__PURE__ */ jsx(Tooltip.Trigger, {
22
+ "data-slot": "tooltip-trigger",
23
+ ...props
24
+ });
25
+ }
26
+ function TooltipContent({ className, side = "top", sideOffset = 4, align = "center", alignOffset = 0, children, ...props }) {
27
+ return /* @__PURE__ */ jsx(Tooltip.Portal, { children: /* @__PURE__ */ jsx(Tooltip.Positioner, {
28
+ align,
29
+ alignOffset,
30
+ side,
31
+ sideOffset,
32
+ className: "isolate z-50",
33
+ children: /* @__PURE__ */ jsxs(Tooltip.Popup, {
34
+ "data-slot": "tooltip-content",
35
+ className: cn("z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
36
+ ...props,
37
+ children: [children, /* @__PURE__ */ jsx(Tooltip.Arrow, { className: "z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5" })]
38
+ })
39
+ }) });
40
+ }
41
+ export { Tooltip$1 as Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@nsaa/core",
3
- "version": "0.1.0-alpha.0",
3
+ "version": "0.1.0-alpha.2",
4
4
  "description": "Nsaa core components: accessible, token-driven, animated to the Nsaa feel spec.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "sideEffects": [
8
8
  "**/*.css",
9
- "./dist/index.js"
9
+ "./dist/lib/track-input-modality.js",
10
+ "./dist/spinner/spinner.js"
10
11
  ],
11
12
  "files": [
12
13
  "dist",
@@ -42,10 +43,11 @@
42
43
  "cmdk": "1.1.1",
43
44
  "input-otp": "1.5.0",
44
45
  "motion": "^14.7.1",
46
+ "react-day-picker": "9.14.0",
45
47
  "tailwind-merge": "^3.7.0",
46
48
  "tailwind-variants": "^3.3.1",
47
49
  "uisfx": "0.4.0",
48
- "@nsaa/tokens": "^0.1.0-alpha.0"
50
+ "@nsaa/tokens": "^0.1.0-alpha.2"
49
51
  },
50
52
  "devDependencies": {
51
53
  "@testing-library/jest-dom": "^7.0.1",
package/src/feel.css CHANGED
@@ -61,9 +61,11 @@
61
61
  }
62
62
 
63
63
  /* ---------------------------------------------------------------- modal recipe (Phase 1)
64
- Overlay opacity; content from the centre; base in, fast out. Dialog and CommandDialog. */
64
+ Overlay opacity; content from the centre; base in, fast out. Dialog, CommandDialog, Alert Dialog. */
65
65
  [data-slot="dialog-overlay"],
66
- [data-slot="dialog-content"] {
66
+ [data-slot="dialog-content"],
67
+ [data-slot="alert-dialog-overlay"],
68
+ [data-slot="alert-dialog-content"] {
67
69
  transition-property: opacity, scale;
68
70
  transition-duration: calc(var(--nsaa-duration-base) * var(--nsaa-time-scale));
69
71
  transition-timing-function: var(--nsaa-ease-out);
@@ -78,7 +80,8 @@
78
80
  }
79
81
  }
80
82
 
81
- [data-slot="dialog-content"] {
83
+ [data-slot="dialog-content"],
84
+ [data-slot="alert-dialog-content"] {
82
85
  transform-origin: center;
83
86
 
84
87
  &[data-starting-style],
@@ -474,6 +477,7 @@
474
477
  [data-slot="popover-content"],
475
478
  [data-slot="dropdown-menu-content"],
476
479
  [data-slot="dialog-content"],
480
+ [data-slot="alert-dialog-content"],
477
481
  [data-slot="drawer-popup"]
478
482
  ) {
479
483
  --nsaa-il-surface: var(--popover);
@@ -526,7 +530,9 @@
526
530
  [data-slot="context-menu-sub-content"],
527
531
  [data-slot="tooltip-content"],
528
532
  [data-slot="dialog-overlay"],
529
- [data-slot="dialog-content"]
533
+ [data-slot="dialog-content"],
534
+ [data-slot="alert-dialog-overlay"],
535
+ [data-slot="alert-dialog-content"]
530
536
  ) {
531
537
  transition-property: opacity;
532
538
  transition-duration: calc(var(--nsaa-reduced-fade) * var(--nsaa-time-scale));
@@ -688,7 +694,9 @@
688
694
  [data-slot="context-menu-sub-content"],
689
695
  [data-slot="tooltip-content"],
690
696
  [data-slot="dialog-overlay"],
691
- [data-slot="dialog-content"]
697
+ [data-slot="dialog-content"],
698
+ [data-slot="alert-dialog-overlay"],
699
+ [data-slot="alert-dialog-content"]
692
700
  ) {
693
701
  transition-property: opacity;
694
702
  transition-duration: calc(var(--nsaa-reduced-fade) * var(--nsaa-time-scale));
@@ -851,7 +859,9 @@
851
859
  [data-slot="context-menu-sub-content"],
852
860
  [data-slot="tooltip-content"],
853
861
  [data-slot="dialog-overlay"],
854
- [data-slot="dialog-content"]
862
+ [data-slot="dialog-content"],
863
+ [data-slot="alert-dialog-overlay"],
864
+ [data-slot="alert-dialog-content"]
855
865
  )[data-instant],
856
866
  :root[data-nsaa-input="keyboard"]
857
867
  :is(
@@ -865,6 +875,8 @@
865
875
  [data-slot="tooltip-content"],
866
876
  [data-slot="dialog-overlay"],
867
877
  [data-slot="dialog-content"],
878
+ [data-slot="alert-dialog-overlay"],
879
+ [data-slot="alert-dialog-content"],
868
880
  [data-slot="drawer-popup"],
869
881
  [data-slot="drawer-overlay"],
870
882
  [data-slot="accordion-content"],
package/src/styles.css CHANGED
@@ -57,7 +57,8 @@
57
57
  }
58
58
 
59
59
  /* shadcn style hooks: `cn-rtl-flip` marks icons the shadcn CLI mirrors for right-to-left (the submenu
60
- chevrons); `cn-input-otp` is styled by base-nova's style sheet, not by the item's classes. */
60
+ chevrons); `cn-input-otp` and two `cn-calendar-*` classes are styled by base-nova's style sheet, not
61
+ by the item's classes. */
61
62
  @layer components {
62
63
  .cn-rtl-flip:where(:dir(rtl)) {
63
64
  rotate: 180deg;
@@ -67,6 +68,23 @@
67
68
  .cn-input-otp {
68
69
  gap: calc(var(--spacing) * 2);
69
70
  }
71
+
72
+ /* Calendar with captionLayout="dropdown" (#136): style-nova.css draws the month and year
73
+ dropdowns' border and focus ring, and pads the caption label; the item's classes don't. */
74
+ .cn-calendar-dropdown-root {
75
+ border: 1px solid var(--input);
76
+
77
+ &:has(:focus) {
78
+ border-color: var(--ring);
79
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--ring) 50%, transparent);
80
+ }
81
+ }
82
+
83
+ .cn-calendar-caption-label {
84
+ height: calc(var(--spacing) * 6);
85
+ padding-right: calc(var(--spacing) * 1);
86
+ padding-left: calc(var(--spacing) * 1.5);
87
+ }
70
88
  }
71
89
 
72
90
  /* Hover only where hovering is real (fine pointers), never on disabled, busy or read-only controls. */