@nsaa/core 0.1.0-alpha.1 → 0.1.0-alpha.3

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 (286) hide show
  1. package/README.md +30 -8
  2. package/dist/_virtual/_rolldown/runtime.js +13 -0
  3. package/dist/accordion/accordion.d.ts +7 -0
  4. package/dist/accordion/accordion.js +54 -0
  5. package/dist/accordion/index.d.ts +3 -0
  6. package/dist/alert/alert.d.ts +19 -0
  7. package/dist/alert/alert.js +58 -0
  8. package/dist/alert/index.d.ts +3 -0
  9. package/dist/alert-dialog/alert-dialog.d.ts +19 -0
  10. package/dist/alert-dialog/alert-dialog.js +106 -0
  11. package/dist/alert-dialog/index.d.ts +3 -0
  12. package/dist/avatar/avatar.d.ts +12 -0
  13. package/dist/avatar/avatar.js +50 -0
  14. package/dist/avatar/index.d.ts +3 -0
  15. package/dist/badge/badge.d.ts +8 -0
  16. package/dist/badge/badge.js +29 -0
  17. package/dist/badge/index.d.ts +3 -0
  18. package/dist/button/button.d.ts +25 -0
  19. package/dist/button/button.js +136 -0
  20. package/dist/button/index.d.ts +3 -0
  21. package/dist/calendar/calendar.d.ts +11 -0
  22. package/dist/calendar/calendar.js +131 -0
  23. package/dist/calendar/index.d.ts +3 -0
  24. package/dist/card/card.d.ts +12 -0
  25. package/dist/card/card.js +55 -0
  26. package/dist/card/index.d.ts +3 -0
  27. package/dist/checkbox/checkbox.d.ts +4 -0
  28. package/dist/checkbox/checkbox.js +35 -0
  29. package/dist/checkbox/index.d.ts +3 -0
  30. package/dist/collapsible/collapsible.d.ts +6 -0
  31. package/dist/collapsible/collapsible.js +24 -0
  32. package/dist/collapsible/index.d.ts +3 -0
  33. package/dist/combobox/combobox.d.ts +27 -0
  34. package/dist/combobox/combobox.js +226 -0
  35. package/dist/combobox/index.d.ts +3 -0
  36. package/dist/command/command.d.ts +20 -0
  37. package/dist/command/command.js +116 -0
  38. package/dist/command/index.d.ts +3 -0
  39. package/dist/context-menu/context-menu.d.ts +30 -0
  40. package/dist/context-menu/context-menu.js +173 -0
  41. package/dist/context-menu/index.d.ts +3 -0
  42. package/dist/dialog/dialog.d.ts +18 -0
  43. package/dist/dialog/dialog.js +112 -0
  44. package/dist/dialog/index.d.ts +3 -0
  45. package/dist/direction.d.ts +3 -0
  46. package/dist/direction.js +2 -0
  47. package/dist/drawer/drawer.d.ts +17 -0
  48. package/dist/drawer/drawer.js +136 -0
  49. package/dist/drawer/index.d.ts +3 -0
  50. package/dist/dropdown-menu/dropdown-menu.d.ts +30 -0
  51. package/dist/dropdown-menu/dropdown-menu.js +177 -0
  52. package/dist/dropdown-menu/index.d.ts +3 -0
  53. package/dist/empty/empty.d.ts +35 -0
  54. package/dist/empty/empty.js +93 -0
  55. package/dist/empty/index.d.ts +3 -0
  56. package/dist/field/field.d.ts +26 -0
  57. package/dist/field/field.js +109 -0
  58. package/dist/field/index.d.ts +3 -0
  59. package/dist/index.d.ts +90 -674
  60. package/dist/index.js +50 -3877
  61. package/dist/input/index.d.ts +3 -0
  62. package/dist/input/input.d.ts +4 -0
  63. package/dist/input/input.js +14 -0
  64. package/dist/input-group/index.d.ts +3 -0
  65. package/dist/input-group/input-group.d.ts +19 -0
  66. package/dist/input-group/input-group.js +78 -0
  67. package/dist/input-otp/index.d.ts +3 -0
  68. package/dist/input-otp/input-otp.d.ts +12 -0
  69. package/dist/input-otp/input-otp.js +73 -0
  70. package/dist/kbd/index.d.ts +3 -0
  71. package/dist/kbd/kbd.d.ts +5 -0
  72. package/dist/kbd/kbd.js +19 -0
  73. package/dist/label/index.d.ts +3 -0
  74. package/dist/label/label.d.ts +4 -0
  75. package/dist/label/label.js +13 -0
  76. package/dist/legacy/icon-button/icon-swap.js +58 -0
  77. package/dist/lib/cn.d.ts +3 -0
  78. package/dist/{cn-DxFBFdwT.js → lib/cn.js} +1 -1
  79. package/dist/lib/control-defaults.js +8 -0
  80. package/dist/lib/icon-swap.d.ts +15 -0
  81. package/dist/lib/icon-swap.js +26 -0
  82. package/dist/lib/input-modality.js +39 -0
  83. package/dist/lib/merge-refs.js +21 -0
  84. package/dist/lib/opener.js +29 -0
  85. package/dist/lib/shortcut.js +50 -0
  86. package/dist/lib/track-input-modality.d.ts +2 -0
  87. package/dist/lib/track-input-modality.js +4 -0
  88. package/dist/lib/tv.js +7 -0
  89. package/dist/lib/use-press.js +48 -0
  90. package/dist/lib/user-action.js +13 -0
  91. package/dist/loaders/arc.d.ts +6 -0
  92. package/dist/loaders/arc.js +31 -0
  93. package/dist/loaders/atom.d.ts +5 -0
  94. package/dist/loaders/atom.js +70 -0
  95. package/dist/loaders/blocks.d.ts +8 -0
  96. package/dist/loaders/blocks.js +74 -0
  97. package/dist/loaders/bouncing-dots.d.ts +3 -0
  98. package/dist/loaders/bouncing-dots.js +45 -0
  99. package/dist/loaders/cap.d.ts +6 -0
  100. package/dist/loaders/cap.js +7 -0
  101. package/dist/loaders/cascade.d.ts +5 -0
  102. package/dist/loaders/cascade.js +50 -0
  103. package/dist/loaders/circular-dots.d.ts +3 -0
  104. package/dist/loaders/circular-dots.js +40 -0
  105. package/dist/loaders/classic-v2.d.ts +3 -0
  106. package/dist/loaders/classic-v2.js +41 -0
  107. package/dist/loaders/classic.d.ts +3 -0
  108. package/dist/loaders/classic.js +48 -0
  109. package/dist/loaders/clock.d.ts +5 -0
  110. package/dist/loaders/clock.js +31 -0
  111. package/dist/loaders/comet.d.ts +5 -0
  112. package/dist/loaders/comet.js +52 -0
  113. package/dist/loaders/compass.d.ts +3 -0
  114. package/dist/loaders/compass.js +39 -0
  115. package/dist/loaders/dual.d.ts +6 -0
  116. package/dist/loaders/dual.js +47 -0
  117. package/dist/loaders/easing.d.ts +6 -0
  118. package/dist/loaders/easing.js +34 -0
  119. package/dist/loaders/eclipse.d.ts +3 -0
  120. package/dist/loaders/eclipse.js +69 -0
  121. package/dist/loaders/fade.js +28 -0
  122. package/dist/loaders/flip.d.ts +3 -0
  123. package/dist/loaders/flip.js +41 -0
  124. package/dist/{frame-CK9IBOZB.js → loaders/frame.js} +2 -50
  125. package/dist/loaders/gather.d.ts +3 -0
  126. package/dist/loaders/gather.js +85 -0
  127. package/dist/loaders/leap.d.ts +3 -0
  128. package/dist/loaders/leap.js +67 -0
  129. package/dist/loaders/linear-dots.d.ts +3 -0
  130. package/dist/loaders/linear-dots.js +54 -0
  131. package/dist/loaders/loading.d.ts +3 -0
  132. package/dist/loaders/loading.js +64 -0
  133. package/dist/loaders/morph.d.ts +3 -0
  134. package/dist/loaders/morph.js +40 -0
  135. package/dist/loaders/motion.d.ts +35 -0
  136. package/dist/loaders/motion.js +51 -0
  137. package/dist/loaders/orbit.d.ts +5 -0
  138. package/dist/loaders/orbit.js +44 -0
  139. package/dist/loaders/pulse.d.ts +3 -0
  140. package/dist/loaders/pulse.js +52 -0
  141. package/dist/loaders/radar.d.ts +5 -0
  142. package/dist/loaders/radar.js +64 -0
  143. package/dist/loaders/ring.d.ts +6 -0
  144. package/dist/loaders/ring.js +38 -0
  145. package/dist/loaders/ripple.d.ts +8 -0
  146. package/dist/loaders/ripple.js +57 -0
  147. package/dist/loaders/slide.d.ts +3 -0
  148. package/dist/loaders/slide.js +74 -0
  149. package/dist/loaders/snake.d.ts +6 -0
  150. package/dist/loaders/snake.js +59 -0
  151. package/dist/loaders/spinners.d.ts +61 -0
  152. package/dist/loaders/spinners.js +63 -0
  153. package/dist/loaders/swirl.d.ts +3 -0
  154. package/dist/loaders/swirl.js +50 -0
  155. package/dist/loaders/text/shared.js +25 -0
  156. package/dist/loaders/text/text-loaders.d.ts +48 -0
  157. package/dist/loaders/text/text-loaders.js +723 -0
  158. package/dist/loaders/trace.d.ts +6 -0
  159. package/dist/loaders/trace.js +46 -0
  160. package/dist/loaders/types.d.ts +10 -0
  161. package/dist/loaders/wave.d.ts +8 -0
  162. package/dist/loaders/wave.js +59 -0
  163. package/dist/loaders-text.d.ts +2 -47
  164. package/dist/loaders-text.js +1 -743
  165. package/dist/loaders.d.ts +36 -132
  166. package/dist/loaders.js +35 -1096
  167. package/dist/native-select/index.d.ts +3 -0
  168. package/dist/native-select/native-select.d.ts +9 -0
  169. package/dist/native-select/native-select.js +44 -0
  170. package/dist/pagination/index.d.ts +3 -0
  171. package/dist/pagination/pagination.d.ts +18 -0
  172. package/dist/pagination/pagination.js +134 -0
  173. package/dist/popover/index.d.ts +3 -0
  174. package/dist/popover/popover.d.ts +10 -0
  175. package/dist/popover/popover.js +54 -0
  176. package/dist/radio-group/index.d.ts +3 -0
  177. package/dist/radio-group/radio-group.d.ts +6 -0
  178. package/dist/radio-group/radio-group.js +33 -0
  179. package/dist/select/index.d.ts +3 -0
  180. package/dist/select/select.d.ts +16 -0
  181. package/dist/select/select.js +148 -0
  182. package/dist/separator/index.d.ts +3 -0
  183. package/dist/separator/separator.d.ts +4 -0
  184. package/dist/separator/separator.js +15 -0
  185. package/dist/skeleton/index.d.ts +3 -0
  186. package/dist/skeleton/skeleton.d.ts +10 -0
  187. package/dist/skeleton/skeleton.js +24 -0
  188. package/dist/slider/index.d.ts +3 -0
  189. package/dist/slider/slider.d.ts +4 -0
  190. package/dist/slider/slider.js +39 -0
  191. package/dist/sound/lazy-uisfx.d.ts +20 -0
  192. package/dist/sound/lazy-uisfx.js +68 -0
  193. package/dist/sound/sound-map.d.ts +72 -0
  194. package/dist/sound/sound-map.js +76 -0
  195. package/dist/sound/sound.d.ts +38 -0
  196. package/dist/sound/sound.js +136 -0
  197. package/dist/sound/uisfx.d.ts +41 -0
  198. package/dist/sound/uisfx.js +59 -0
  199. package/dist/sound-uisfx.d.ts +2 -37
  200. package/dist/sound-uisfx.js +1 -58
  201. package/dist/sources/accordion.css +3 -0
  202. package/dist/sources/alert-dialog.css +26 -0
  203. package/dist/sources/alert.css +8 -0
  204. package/dist/sources/avatar.css +3 -0
  205. package/dist/sources/badge.css +3 -0
  206. package/dist/sources/button.css +24 -0
  207. package/dist/sources/calendar.css +25 -0
  208. package/dist/sources/card.css +3 -0
  209. package/dist/sources/checkbox.css +6 -0
  210. package/dist/sources/collapsible.css +2 -0
  211. package/dist/sources/combobox.css +28 -0
  212. package/dist/sources/command.css +30 -0
  213. package/dist/sources/context-menu.css +6 -0
  214. package/dist/sources/dialog.css +26 -0
  215. package/dist/sources/drawer.css +6 -0
  216. package/dist/sources/dropdown-menu.css +6 -0
  217. package/dist/sources/empty.css +3 -0
  218. package/dist/sources/field.css +5 -0
  219. package/dist/sources/input-group.css +27 -0
  220. package/dist/sources/input-otp.css +8 -0
  221. package/dist/sources/input.css +3 -0
  222. package/dist/sources/kbd.css +3 -0
  223. package/dist/sources/label.css +3 -0
  224. package/dist/sources/loaders-text.css +8 -0
  225. package/dist/sources/loaders.css +40 -0
  226. package/dist/sources/native-select.css +3 -0
  227. package/dist/sources/pagination.css +25 -0
  228. package/dist/sources/popover.css +3 -0
  229. package/dist/sources/radio-group.css +6 -0
  230. package/dist/sources/select.css +6 -0
  231. package/dist/sources/separator.css +3 -0
  232. package/dist/sources/skeleton.css +3 -0
  233. package/dist/sources/slider.css +6 -0
  234. package/dist/sources/spinner.css +20 -0
  235. package/dist/sources/switch.css +6 -0
  236. package/dist/sources/table.css +3 -0
  237. package/dist/sources/tabs.css +3 -0
  238. package/dist/sources/textarea.css +3 -0
  239. package/dist/sources/toast.css +25 -0
  240. package/dist/sources/toggle-group.css +32 -0
  241. package/dist/sources/toolbar.css +34 -0
  242. package/dist/sources/tooltip.css +3 -0
  243. package/dist/spinner/index.d.ts +5 -0
  244. package/dist/spinner/loader-provider.d.ts +16 -0
  245. package/dist/spinner/loader-provider.js +28 -0
  246. package/dist/spinner/registry.d.ts +9 -0
  247. package/dist/spinner/registry.js +15 -0
  248. package/dist/spinner/spinner.d.ts +26 -0
  249. package/dist/spinner/spinner.js +143 -0
  250. package/dist/switch/index.d.ts +3 -0
  251. package/dist/switch/switch.d.ts +6 -0
  252. package/dist/switch/switch.js +25 -0
  253. package/dist/table/index.d.ts +3 -0
  254. package/dist/table/table.d.ts +17 -0
  255. package/dist/table/table.js +66 -0
  256. package/dist/tabs/index.d.ts +3 -0
  257. package/dist/tabs/tabs.d.ts +11 -0
  258. package/dist/tabs/tabs.js +46 -0
  259. package/dist/textarea/index.d.ts +3 -0
  260. package/dist/textarea/textarea.d.ts +4 -0
  261. package/dist/textarea/textarea.js +12 -0
  262. package/dist/toast/index.d.ts +3 -0
  263. package/dist/toast/toast.d.ts +17 -0
  264. package/dist/toast/toast.js +211 -0
  265. package/dist/toggle-group/index.d.ts +3 -0
  266. package/dist/toggle-group/toggle-group.d.ts +64 -0
  267. package/dist/toggle-group/toggle-group.js +95 -0
  268. package/dist/tokens/dist/motion.d.ts +24 -0
  269. package/dist/{motion-NQq2BA78.js → tokens/dist/motion.js} +1 -1
  270. package/dist/toolbar/index.d.ts +3 -0
  271. package/dist/toolbar/overflow.d.ts +4 -0
  272. package/dist/toolbar/overflow.js +242 -0
  273. package/dist/toolbar/toolbar-item.d.ts +29 -0
  274. package/dist/toolbar/toolbar-item.js +71 -0
  275. package/dist/toolbar/toolbar.d.ts +73 -0
  276. package/dist/toolbar/toolbar.js +250 -0
  277. package/dist/tooltip/index.d.ts +3 -0
  278. package/dist/tooltip/tooltip.d.ts +7 -0
  279. package/dist/tooltip/tooltip.js +41 -0
  280. package/package.json +9 -5
  281. package/src/feel.css +52 -0
  282. package/src/styles-base.css +142 -0
  283. package/src/styles.css +3 -133
  284. package/dist/registry-2PyPW9Xw.js +0 -390
  285. package/dist/registry-DjfWNw3R.d.ts +0 -18
  286. package/dist/sound-DiYNAnR_.d.ts +0 -61
@@ -0,0 +1,723 @@
1
+ "use client";
2
+ import { cn } from "../../lib/cn.js";
3
+ import { PLAY_STATE, StatusLabel, TextLoaderStyle, textDuration } from "./shared.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ // src/loaders/text/text-loaders.tsx
6
+ const durationVar = (duration) => duration === void 0 ? void 0 : { "--nsaa-loader-duration": `${duration}ms` };
7
+ const SHIMMER = `
8
+ .nsaa-loader-shimmer-text {
9
+ --nsaa-loader-spread: calc(var(--nsaa-loader-chars, 10) * 2px);
10
+ display: inline-block;
11
+ -webkit-text-fill-color: transparent;
12
+ background-image:
13
+ linear-gradient(90deg, transparent calc(50% - var(--nsaa-loader-spread)), currentColor, transparent calc(50% + var(--nsaa-loader-spread))),
14
+ linear-gradient(color-mix(in oklab, currentColor 55%, transparent), color-mix(in oklab, currentColor 55%, transparent));
15
+ background-size: 250% 100%, auto;
16
+ background-repeat: no-repeat, padding-box;
17
+ background-clip: text;
18
+ -webkit-background-clip: text;
19
+ animation: nsaa-loader-shimmer-text ${textDuration("shimmer-text")} linear infinite;
20
+ animation-play-state: ${PLAY_STATE};
21
+ }
22
+ @keyframes nsaa-loader-shimmer-text {
23
+ from { background-position: 100% center, 0 0; }
24
+ to { background-position: 0% center, 0 0; }
25
+ }
26
+ @media (forced-colors: active) {
27
+ .nsaa-loader-shimmer-text {
28
+ -webkit-text-fill-color: CanvasText;
29
+ background: none;
30
+ animation: none;
31
+ }
32
+ }`;
33
+ const STATIC_SHIMMER = `
34
+ .nsaa-loader-shimmer-text {
35
+ -webkit-text-fill-color: currentColor;
36
+ background: none;
37
+ animation: none;
38
+ }`;
39
+ /** "Thinking…", "Processing payment…": a light band sweeps across the words. Static text under reduced motion. */
40
+ function ShimmerText({ children, label, duration, className, style, ...props }) {
41
+ return /* @__PURE__ */ jsxs("span", {
42
+ role: "status",
43
+ "data-slot": "shimmer-text",
44
+ className,
45
+ style: {
46
+ ...durationVar(duration),
47
+ ...style
48
+ },
49
+ ...props,
50
+ children: [
51
+ /* @__PURE__ */ jsx(TextLoaderStyle, {
52
+ name: "shimmer-text",
53
+ css: SHIMMER,
54
+ reduced: STATIC_SHIMMER
55
+ }),
56
+ /* @__PURE__ */ jsx(StatusLabel, { children: label ?? children }),
57
+ /* @__PURE__ */ jsx("span", {
58
+ "aria-hidden": "true",
59
+ "data-loader": "shimmer-text",
60
+ className: "nsaa-loader-shimmer-text",
61
+ style: { "--nsaa-loader-chars": children.length },
62
+ children
63
+ })
64
+ ]
65
+ });
66
+ }
67
+ const WAVE = `
68
+ .nsaa-loader-shimmer-wave > span {
69
+ display: inline-block;
70
+ white-space: pre;
71
+ opacity: 0.55;
72
+ animation: nsaa-loader-shimmer-wave ${textDuration("shimmer-wave")} ease-in-out infinite;
73
+ animation-delay: calc(${textDuration("shimmer-wave")} * var(--nsaa-loader-i) / var(--nsaa-loader-count));
74
+ animation-play-state: ${PLAY_STATE};
75
+ }
76
+ @keyframes nsaa-loader-shimmer-wave {
77
+ 0%, 60%, 100% { opacity: 0.55; transform: none; }
78
+ 30% { opacity: 1; transform: translateY(-2px) scale(1.1); }
79
+ }`;
80
+ const STATIC_WAVE = `
81
+ .nsaa-loader-shimmer-wave > span {
82
+ opacity: 1;
83
+ animation: none;
84
+ }`;
85
+ /** Longer AI status lines: each letter lifts and brightens in turn. Static text under reduced motion. */
86
+ function ShimmerWave({ children, label, duration, className, style, ...props }) {
87
+ const letters = typeof Intl !== "undefined" && "Segmenter" in Intl ? [...new Intl.Segmenter(void 0, { granularity: "grapheme" }).segment(children)].map((s) => s.segment) : [...children];
88
+ return /* @__PURE__ */ jsxs("span", {
89
+ role: "status",
90
+ "data-slot": "shimmer-wave",
91
+ className,
92
+ style: {
93
+ ...durationVar(duration),
94
+ ...style
95
+ },
96
+ ...props,
97
+ children: [
98
+ /* @__PURE__ */ jsx(TextLoaderStyle, {
99
+ name: "shimmer-wave",
100
+ css: WAVE,
101
+ reduced: STATIC_WAVE
102
+ }),
103
+ /* @__PURE__ */ jsx(StatusLabel, { children: label ?? children }),
104
+ /* @__PURE__ */ jsx("span", {
105
+ "aria-hidden": "true",
106
+ "data-loader": "shimmer-wave",
107
+ className: "nsaa-loader-shimmer-wave",
108
+ style: { "--nsaa-loader-count": letters.length },
109
+ children: letters.map((letter, i) => /* @__PURE__ */ jsx("span", {
110
+ style: { "--nsaa-loader-i": i },
111
+ children: letter
112
+ }, i))
113
+ })
114
+ ]
115
+ });
116
+ }
117
+ const DOTS = `
118
+ .nsaa-loader-text-dots > span {
119
+ animation: nsaa-loader-text-dots ${textDuration("text-dots")} infinite;
120
+ animation-delay: calc(${textDuration("text-dots")} / 7 * (var(--nsaa-loader-i) + 1));
121
+ animation-play-state: ${PLAY_STATE};
122
+ }
123
+ @keyframes nsaa-loader-text-dots {
124
+ 0%, 100% { opacity: 0; }
125
+ 50% { opacity: 1; }
126
+ }`;
127
+ const STATIC_DOTS = `
128
+ .nsaa-loader-text-dots > span {
129
+ opacity: 1;
130
+ animation: none;
131
+ }`;
132
+ /** "Loading…" with dots that step in. A static "…" under reduced motion. */
133
+ function TextDots({ children, dots = 3, duration, className, style, ...props }) {
134
+ const count = Number.isFinite(dots) ? Math.max(1, Math.floor(dots)) : 3;
135
+ return /* @__PURE__ */ jsxs("span", {
136
+ role: "status",
137
+ "data-slot": "text-dots",
138
+ className: cn("inline-flex items-baseline", className),
139
+ style: {
140
+ ...durationVar(duration),
141
+ ...style
142
+ },
143
+ ...props,
144
+ children: [
145
+ /* @__PURE__ */ jsx(TextLoaderStyle, {
146
+ name: "text-dots",
147
+ css: DOTS,
148
+ reduced: STATIC_DOTS
149
+ }),
150
+ /* @__PURE__ */ jsx("span", { children }),
151
+ /* @__PURE__ */ jsx("span", {
152
+ "aria-hidden": "true",
153
+ "data-loader": "text-dots",
154
+ className: "nsaa-loader-text-dots inline-flex",
155
+ children: Array.from({ length: count }, (_, i) => /* @__PURE__ */ jsx("span", {
156
+ style: { "--nsaa-loader-i": i },
157
+ children: "."
158
+ }, i))
159
+ })
160
+ ]
161
+ });
162
+ }
163
+ const TYPING = `
164
+ .nsaa-loader-typing {
165
+ display: inline-flex;
166
+ align-items: center;
167
+ gap: 12%;
168
+ width: calc(var(--nsaa-loader-size, var(--nsaa-loader-size-md)) * 2);
169
+ height: var(--nsaa-loader-size, var(--nsaa-loader-size-md));
170
+ }
171
+ .nsaa-loader-typing > span {
172
+ flex: 1;
173
+ aspect-ratio: 1;
174
+ border-radius: 50%;
175
+ background: currentColor;
176
+ opacity: 0.5;
177
+ animation: nsaa-loader-typing ${textDuration("typing")} infinite;
178
+ animation-delay: calc(${textDuration("typing")} * 0.16 * var(--nsaa-loader-i));
179
+ animation-play-state: ${PLAY_STATE};
180
+ }
181
+ @keyframes nsaa-loader-typing {
182
+ 0%, 100% { transform: translateY(0); opacity: 0.5; }
183
+ 50% { transform: translateY(-50%); opacity: 1; }
184
+ }`;
185
+ const STATIC_TYPING = `
186
+ .nsaa-loader-typing > span {
187
+ opacity: 1;
188
+ animation: none;
189
+ }`;
190
+ /** A chat "is typing" bubble: three dots bob in turn. Three static dots under reduced motion. */
191
+ function Typing({ dots = 3, label = "Typing", duration, className, style, ...props }) {
192
+ return /* @__PURE__ */ jsxs("span", {
193
+ role: "status",
194
+ "data-slot": "typing",
195
+ className,
196
+ style: {
197
+ ...durationVar(duration),
198
+ ...style
199
+ },
200
+ ...props,
201
+ children: [
202
+ /* @__PURE__ */ jsx(TextLoaderStyle, {
203
+ name: "typing",
204
+ css: TYPING,
205
+ reduced: STATIC_TYPING
206
+ }),
207
+ /* @__PURE__ */ jsx(StatusLabel, { children: label }),
208
+ /* @__PURE__ */ jsx("span", {
209
+ "aria-hidden": "true",
210
+ "data-loader": "typing",
211
+ className: "nsaa-loader-typing",
212
+ children: Array.from({ length: dots }, (_, i) => /* @__PURE__ */ jsx("span", { style: { "--nsaa-loader-i": i } }, i))
213
+ })
214
+ ]
215
+ });
216
+ }
217
+ const ANALYZING = `
218
+ .nsaa-loader-analyzing-image {
219
+ position: relative;
220
+ isolation: isolate;
221
+ display: inline-block;
222
+ width: calc(var(--nsaa-loader-size, var(--nsaa-loader-size-xl)) * 2);
223
+ aspect-ratio: 1;
224
+ }
225
+ .nsaa-loader-analyzing-image > * {
226
+ position: absolute;
227
+ inset: 0;
228
+ }
229
+ .nsaa-loader-analyzing-image-cover {
230
+ background: var(--nsaa-loader-background, var(--nsaa-color-page));
231
+ transform-origin: left center;
232
+ animation: nsaa-loader-analyzing-cover ${textDuration("analyzing-image")} var(--nsaa-ease-out) infinite alternate;
233
+ animation-play-state: ${PLAY_STATE};
234
+ }
235
+ .nsaa-loader-analyzing-image-scan {
236
+ inset: 0 auto 0 0;
237
+ width: 7%;
238
+ border-radius: calc(infinity * 1px);
239
+ background: currentColor;
240
+ animation: nsaa-loader-analyzing-scan ${textDuration("analyzing-image")} var(--nsaa-ease-out) infinite alternate;
241
+ animation-play-state: ${PLAY_STATE};
242
+ }
243
+ @keyframes nsaa-loader-analyzing-cover {
244
+ 0% { transform: scaleX(1); }
245
+ 60%, 100% { transform: scaleX(0); }
246
+ }
247
+ @keyframes nsaa-loader-analyzing-scan {
248
+ 0% { transform: translateX(1400%); }
249
+ 60%, 100% { transform: translateX(-80%); }
250
+ }`;
251
+ const STATIC_ANALYZING = `
252
+ .nsaa-loader-analyzing-image-cover {
253
+ animation: none;
254
+ transform: none;
255
+ }
256
+ .nsaa-loader-analyzing-image-scan {
257
+ display: none;
258
+ }`;
259
+ const FRAME = "M6.8 21H17.2C18.8802 21 19.7202 21 20.362 20.673C20.9265 20.3854 21.3854 19.9265 21.673 19.362C22 18.7202 22 17.8802 22 16.2V7.8C22 6.11984 22 5.27976 21.673 4.63803C21.3854 4.07354 20.9265 3.6146 20.362 3.32698C19.7202 3 18.8802 3 17.2 3H6.8C5.11984 3 4.27976 3 3.63803 3.32698C3.07354 3.6146 2.6146 4.07354 2.32698 4.63803C2 5.27976 2 6.11984 2 7.8V16.2C2 17.8802 2 18.7202 2.32698 19.362C2.6146 19.9265 3.07354 20.3854 3.63803 20.673C4.27976 21 5.11984 21 6.8 21Z";
260
+ const PICTURE = "M4.27209 20.7279L10.8686 14.1314C11.2646 13.7354 11.4627 13.5373 11.691 13.4632C11.8918 13.3979 12.1082 13.3979 12.309 13.4632C12.5373 13.5373 12.7354 13.7354 13.1314 14.1314L19.6839 20.6839M14 15L16.8686 12.1314C17.2646 11.7354 17.4627 11.5373 17.691 11.4632C17.8918 11.3979 18.1082 11.3979 18.309 11.4632C18.5373 11.5373 18.7354 11.7354 19.1314 12.1314L22 15M10 9C10 10.1046 9.10457 11 8 11C6.89543 11 6 10.1046 6 9C6 7.89543 6.89543 7 8 7C9.10457 7 10 7.89543 10 9Z";
261
+ const NOISE = [
262
+ [
263
+ 6,
264
+ 19,
265
+ 1,
266
+ 1
267
+ ],
268
+ [
269
+ 7,
270
+ 18,
271
+ 1,
272
+ 1
273
+ ],
274
+ [
275
+ 7,
276
+ 19,
277
+ 3,
278
+ 1
279
+ ],
280
+ [
281
+ 9,
282
+ 18,
283
+ 1,
284
+ 1
285
+ ],
286
+ [
287
+ 14,
288
+ 19,
289
+ 3,
290
+ 1
291
+ ],
292
+ [
293
+ 15,
294
+ 18,
295
+ 1,
296
+ 1
297
+ ],
298
+ [
299
+ 5,
300
+ 18,
301
+ 2,
302
+ 1
303
+ ],
304
+ [
305
+ 5,
306
+ 17,
307
+ 1,
308
+ 1
309
+ ],
310
+ [
311
+ 10,
312
+ 19,
313
+ 1,
314
+ 1
315
+ ],
316
+ [
317
+ 7,
318
+ 17,
319
+ 1,
320
+ 1
321
+ ],
322
+ [
323
+ 11,
324
+ 19,
325
+ 1,
326
+ 1
327
+ ],
328
+ [
329
+ 10,
330
+ 18,
331
+ 1,
332
+ 1
333
+ ],
334
+ [
335
+ 17,
336
+ 19,
337
+ 1,
338
+ 1
339
+ ],
340
+ [
341
+ 15,
342
+ 4,
343
+ 2,
344
+ 1
345
+ ],
346
+ [
347
+ 3,
348
+ 9,
349
+ 1,
350
+ 3
351
+ ],
352
+ [
353
+ 4,
354
+ 10,
355
+ 1,
356
+ 2
357
+ ],
358
+ [
359
+ 6,
360
+ 9,
361
+ 1,
362
+ 1
363
+ ],
364
+ [
365
+ 15,
366
+ 5,
367
+ 1,
368
+ 1
369
+ ],
370
+ [
371
+ 20,
372
+ 8,
373
+ 1,
374
+ 3
375
+ ],
376
+ [
377
+ 19,
378
+ 9,
379
+ 1,
380
+ 1
381
+ ],
382
+ [
383
+ 7,
384
+ 13,
385
+ 1,
386
+ 1
387
+ ],
388
+ [
389
+ 9,
390
+ 11,
391
+ 1,
392
+ 1
393
+ ],
394
+ [
395
+ 16,
396
+ 12,
397
+ 1,
398
+ 2
399
+ ],
400
+ [
401
+ 13,
402
+ 14,
403
+ 1,
404
+ 1
405
+ ],
406
+ [
407
+ 12,
408
+ 11,
409
+ 1,
410
+ 1
411
+ ],
412
+ [
413
+ 10,
414
+ 9,
415
+ 1,
416
+ 1
417
+ ],
418
+ [
419
+ 10,
420
+ 15,
421
+ 1,
422
+ 1
423
+ ],
424
+ [
425
+ 10,
426
+ 13,
427
+ 1,
428
+ 1
429
+ ],
430
+ [
431
+ 15,
432
+ 9,
433
+ 1,
434
+ 1
435
+ ],
436
+ [
437
+ 13,
438
+ 10,
439
+ 1,
440
+ 1
441
+ ],
442
+ [
443
+ 12,
444
+ 14,
445
+ 1,
446
+ 1
447
+ ],
448
+ [
449
+ 5,
450
+ 4,
451
+ 3,
452
+ 1
453
+ ],
454
+ [
455
+ 6,
456
+ 5,
457
+ 1,
458
+ 1
459
+ ],
460
+ [
461
+ 7,
462
+ 14,
463
+ 1,
464
+ 2
465
+ ],
466
+ [
467
+ 6,
468
+ 14,
469
+ 3,
470
+ 1
471
+ ],
472
+ [
473
+ 16,
474
+ 8,
475
+ 1,
476
+ 1
477
+ ],
478
+ [
479
+ 8,
480
+ 9,
481
+ 1,
482
+ 1
483
+ ],
484
+ [
485
+ 20,
486
+ 16,
487
+ 1,
488
+ 1
489
+ ],
490
+ [
491
+ 12,
492
+ 12,
493
+ 1,
494
+ 1
495
+ ],
496
+ [
497
+ 8,
498
+ 8,
499
+ 1,
500
+ 1
501
+ ],
502
+ [
503
+ 14,
504
+ 12,
505
+ 1,
506
+ 1
507
+ ],
508
+ [
509
+ 17,
510
+ 16,
511
+ 2,
512
+ 1
513
+ ],
514
+ [
515
+ 14,
516
+ 17,
517
+ 1,
518
+ 1
519
+ ],
520
+ [
521
+ 11,
522
+ 5,
523
+ 3,
524
+ 1
525
+ ],
526
+ [
527
+ 12,
528
+ 4,
529
+ 1,
530
+ 1
531
+ ],
532
+ [
533
+ 12,
534
+ 7,
535
+ 1,
536
+ 1
537
+ ],
538
+ [
539
+ 7,
540
+ 11,
541
+ 1,
542
+ 1
543
+ ],
544
+ [
545
+ 15,
546
+ 15,
547
+ 1,
548
+ 1
549
+ ],
550
+ [
551
+ 11,
552
+ 11,
553
+ 1,
554
+ 1
555
+ ],
556
+ [
557
+ 13,
558
+ 9,
559
+ 1,
560
+ 1
561
+ ],
562
+ [
563
+ 12,
564
+ 15,
565
+ 1,
566
+ 1
567
+ ],
568
+ [
569
+ 9,
570
+ 12,
571
+ 2,
572
+ 1
573
+ ],
574
+ [
575
+ 19,
576
+ 13,
577
+ 2,
578
+ 1
579
+ ],
580
+ [
581
+ 9,
582
+ 6,
583
+ 1,
584
+ 1
585
+ ],
586
+ [
587
+ 20,
588
+ 4,
589
+ 1,
590
+ 1
591
+ ],
592
+ [
593
+ 19,
594
+ 4,
595
+ 1,
596
+ 1
597
+ ],
598
+ [
599
+ 3,
600
+ 15,
601
+ 1,
602
+ 2
603
+ ],
604
+ [
605
+ 3,
606
+ 19,
607
+ 1,
608
+ 1
609
+ ]
610
+ ];
611
+ /** An image upload or scan: the picture dissolves into pixels behind a scan line. A static picture under reduced motion. */
612
+ function AnalyzingImage({ label = "Analyzing image", duration, className, style, ...props }) {
613
+ const stroke = {
614
+ stroke: "currentColor",
615
+ strokeWidth: 1.5,
616
+ strokeLinecap: "round",
617
+ strokeLinejoin: "round"
618
+ };
619
+ return /* @__PURE__ */ jsxs("span", {
620
+ role: "status",
621
+ "data-slot": "analyzing-image",
622
+ className: cn("inline-block", className),
623
+ style: {
624
+ ...durationVar(duration),
625
+ ...style
626
+ },
627
+ ...props,
628
+ children: [
629
+ /* @__PURE__ */ jsx(TextLoaderStyle, {
630
+ name: "analyzing-image",
631
+ css: ANALYZING,
632
+ reduced: STATIC_ANALYZING
633
+ }),
634
+ /* @__PURE__ */ jsx(StatusLabel, { children: label }),
635
+ /* @__PURE__ */ jsxs("span", {
636
+ "aria-hidden": "true",
637
+ "data-loader": "analyzing-image",
638
+ className: "nsaa-loader-analyzing-image",
639
+ children: [
640
+ /* @__PURE__ */ jsxs("svg", {
641
+ viewBox: "0 0 24 24",
642
+ fill: "none",
643
+ "aria-hidden": "true",
644
+ children: [/* @__PURE__ */ jsx("path", {
645
+ d: FRAME,
646
+ ...stroke
647
+ }), NOISE.map(([x, y, width, height]) => /* @__PURE__ */ jsx("rect", {
648
+ x,
649
+ y,
650
+ width,
651
+ height,
652
+ fill: "currentColor"
653
+ }, `${x}-${y}`))]
654
+ }),
655
+ /* @__PURE__ */ jsx("span", { className: "nsaa-loader-analyzing-image-cover" }),
656
+ /* @__PURE__ */ jsxs("svg", {
657
+ viewBox: "0 0 24 24",
658
+ fill: "none",
659
+ "aria-hidden": "true",
660
+ children: [/* @__PURE__ */ jsx("path", {
661
+ d: FRAME,
662
+ ...stroke
663
+ }), /* @__PURE__ */ jsx("path", {
664
+ d: PICTURE,
665
+ ...stroke,
666
+ className: "nsaa-loader-analyzing-image-picture"
667
+ })]
668
+ }),
669
+ /* @__PURE__ */ jsx("span", { className: "nsaa-loader-analyzing-image-scan" })
670
+ ]
671
+ })
672
+ ]
673
+ });
674
+ }
675
+ const TERMINAL = `
676
+ .nsaa-loader-terminal-cursor {
677
+ display: inline-block;
678
+ width: 0.5em;
679
+ height: 1em;
680
+ background: currentColor;
681
+ animation: nsaa-loader-terminal ${textDuration("terminal")} step-end infinite;
682
+ animation-play-state: ${PLAY_STATE};
683
+ }
684
+ @keyframes nsaa-loader-terminal {
685
+ 0%, 100% { opacity: 1; }
686
+ 50% { opacity: 0; }
687
+ }`;
688
+ const STATIC_TERMINAL = `
689
+ .nsaa-loader-terminal-cursor {
690
+ animation: none;
691
+ }`;
692
+ /** CLI or log-style progress: a prompt, the last line and a blinking cursor. Static under reduced motion. */
693
+ function Terminal({ prompt = ">", children, label = "Loading", duration, className, style, ...props }) {
694
+ return /* @__PURE__ */ jsxs("span", {
695
+ role: "status",
696
+ "data-slot": "terminal",
697
+ className: cn("inline-flex items-center gap-[0.25em] font-mono", className),
698
+ style: {
699
+ ...durationVar(duration),
700
+ ...style
701
+ },
702
+ ...props,
703
+ children: [
704
+ /* @__PURE__ */ jsx(TextLoaderStyle, {
705
+ name: "terminal",
706
+ css: TERMINAL,
707
+ reduced: STATIC_TERMINAL
708
+ }),
709
+ /* @__PURE__ */ jsx(StatusLabel, { children: label }),
710
+ /* @__PURE__ */ jsxs("span", {
711
+ "aria-hidden": "true",
712
+ "data-loader": "terminal",
713
+ className: "inline-flex items-center gap-[0.25em]",
714
+ children: [
715
+ /* @__PURE__ */ jsx("span", { children: prompt }),
716
+ children !== void 0 && /* @__PURE__ */ jsx("span", { children }),
717
+ /* @__PURE__ */ jsx("span", { className: "nsaa-loader-terminal-cursor" })
718
+ ]
719
+ })
720
+ ]
721
+ });
722
+ }
723
+ export { AnalyzingImage, ShimmerText, ShimmerWave, Terminal, TextDots, Typing };
@@ -0,0 +1,6 @@
1
+
2
+ import { SpinnerProps } from "./types.js";
3
+ import { CapProps } from "./cap.js";
4
+ import { EasingProps } from "./easing.js";
5
+ export interface TraceProps extends SpinnerProps, EasingProps, CapProps {}
6
+ export declare function Trace({ cap, easing, ...rest }: TraceProps): import("react").JSX.Element;