@actioneer/ads 0.2.4 → 0.3.1

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 (62) hide show
  1. package/components/ai-elements/chain-of-thought.d.ts +88 -6
  2. package/components/ai-elements/chain-of-thought.js +370 -107
  3. package/components/ai-elements/chart.d.ts +30 -0
  4. package/components/ai-elements/chart.js +303 -0
  5. package/components/ai-elements/index.d.ts +2 -0
  6. package/components/ai-elements/message.d.ts +12 -2
  7. package/components/ai-elements/message.js +133 -100
  8. package/components/ai-elements/research-activity.d.ts +62 -0
  9. package/components/ai-elements/research-activity.js +278 -0
  10. package/components/ai-elements/task.d.ts +7 -3
  11. package/components/ai-elements/task.js +84 -52
  12. package/components/ai-elements/tool.js +39 -35
  13. package/components/ai-elements/voice.d.ts +7 -1
  14. package/components/ai-elements/voice.js +234 -180
  15. package/components/alert.js +28 -16
  16. package/components/answer.d.ts +16 -0
  17. package/components/answer.js +273 -249
  18. package/components/assistant-ui/attachment.js +5 -1
  19. package/components/assistant-ui/composer-deep-research.js +44 -29
  20. package/components/assistant-ui/composer-harness.js +45 -27
  21. package/components/assistant-ui/composer.js +16 -16
  22. package/components/assistant-ui/index.d.ts +0 -1
  23. package/components/assistant-ui/message.d.ts +7 -0
  24. package/components/assistant-ui/message.js +36 -36
  25. package/components/assistant-ui/thread.js +1 -1
  26. package/components/brand-texture.d.ts +37 -0
  27. package/components/brand-texture.js +54 -0
  28. package/components/code-block.d.ts +42 -0
  29. package/components/code-block.js +235 -0
  30. package/components/drawer.d.ts +1 -1
  31. package/components/file-dropzone.d.ts +32 -0
  32. package/components/file-dropzone.js +134 -0
  33. package/components/index.d.ts +10 -0
  34. package/components/index.js +482 -433
  35. package/components/infinite-canvas.d.ts +50 -0
  36. package/components/infinite-canvas.js +215 -0
  37. package/components/page-header.d.ts +22 -0
  38. package/components/page-header.js +52 -0
  39. package/components/resizable-panel.d.ts +29 -0
  40. package/components/resizable-panel.js +102 -0
  41. package/components/reveal.d.ts +36 -0
  42. package/components/reveal.js +35 -0
  43. package/components/scroll-area.d.ts +19 -0
  44. package/components/scroll-area.js +57 -0
  45. package/components/setting-row.d.ts +35 -0
  46. package/components/setting-row.js +86 -0
  47. package/components/sidebar.js +131 -131
  48. package/components/stepper.d.ts +40 -0
  49. package/components/stepper.js +102 -0
  50. package/components/table.js +16 -15
  51. package/components/tabs.js +1 -1
  52. package/lib/icons.d.ts +12 -0
  53. package/lib/icons.js +98 -95
  54. package/lib/motion.d.ts +7 -3
  55. package/lib/motion.js +29 -27
  56. package/llms.txt +123 -28
  57. package/manifest.json +883 -68
  58. package/package.json +2 -2
  59. package/styles.css +179 -30
  60. package/theme.css +29 -17
  61. package/components/assistant-ui/smart-message-text.d.ts +0 -15
  62. package/components/assistant-ui/smart-message-text.js +0 -29
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actioneer/ads",
3
- "version": "0.2.4",
3
+ "version": "0.3.1",
4
4
  "description": "Actioneer Design System 1.0 — React 19 + Tailwind v4 component library.",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -38,9 +38,9 @@
38
38
  "@assistant-ui/react-markdown": "^0.14.5",
39
39
  "@hugeicons/core-free-icons": "^4.2.2",
40
40
  "@hugeicons/react": "^1.1.9",
41
- "@openuidev/react-lang": "^0.2.8",
42
41
  "@paper-design/shaders": "^0.0.77",
43
42
  "@paper-design/shaders-react": "^0.0.77",
43
+ "@xyflow/react": "^12.11.2",
44
44
  "class-variance-authority": "^0.7.1",
45
45
  "clsx": "^2.1.1",
46
46
  "motion": "^12.42.2",
package/styles.css CHANGED
@@ -34,28 +34,34 @@
34
34
  */
35
35
  @theme {
36
36
  /* ---- Typography ----
37
- One typeface only. No monospace font — numeric/code contexts use
38
- Aribau Grotesk with `tabular-nums` for aligned figures. */
37
+ One brand typeface. Figures inside prose stay in Aribau Grotesk with
38
+ `tabular-nums`; only literal source code steps to the mono stack. */
39
39
  --font-sans: "Aribau Grotesk", ui-sans-serif, system-ui, -apple-system,
40
40
  "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
41
41
 
42
- /* ---- Type scale ---- base = 14px (0.875rem). Root stays 16px so the
43
- spacing grid is unaffected; only text sizes are anchored to 14px. */
42
+ /* Source code only (CodeBlock, inline Code). ADS ships no mono webfont —
43
+ this resolves to the reader's platform mono, which is what a developer
44
+ already reads code in. Never use it for UI copy or data. */
45
+ --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
46
+ "Liberation Mono", "Courier New", monospace;
47
+
48
+ /* ---- Type scale ---- base = 15px (0.9375rem). Root stays 16px so the
49
+ spacing grid is unaffected; only text sizes are anchored to 15px. */
44
50
  /* SIX sizes only — a deliberately small ladder (captions → display).
45
51
  Don't reintroduce 2xs/3xl/4xl or in-between steps; if a size feels
46
52
  missing, the answer is weight/color, not a new size. */
47
- --text-xs: 0.75rem; /* 12px — captions, secondary text, table cells, keycaps */
48
- --text-xs--line-height: 1rem;
49
- /* text-sm is aliased to text-xs (both 12px). The scale is intentionally
50
- 12 · 14 · 15 · 21 · 26 with no in-between tier — keeping the token
51
- pointed at 12px stops any stray `text-sm` from falling back to
52
- Tailwind's default 14px, which would silently read as base. */
53
- --text-sm: 0.75rem;
54
- --text-sm--line-height: 1rem;
55
- --text-base: 0.875rem; /* 14px — BASE body */
56
- --text-base--line-height: 1.25rem;
57
- --text-lg: 0.9375rem; /* 15px — emphasized body, section headings */
58
- --text-lg--line-height: 1.375rem;
53
+ --text-xs: 0.8125rem; /* 13px — the FLOOR: captions, secondary text, table cells, keycaps */
54
+ --text-xs--line-height: 1.125rem;
55
+ /* text-sm is aliased to text-xs (both 13px). The scale is intentionally
56
+ 13 · 15 · 17 · 21 · 26 with no in-between tier — keeping the token
57
+ pointed at 13px stops any stray `text-sm` from falling back to
58
+ Tailwind's default 14px, which would land off the scale. */
59
+ --text-sm: 0.8125rem;
60
+ --text-sm--line-height: 1.125rem;
61
+ --text-base: 0.9375rem; /* 15px — BASE body */
62
+ --text-base--line-height: 1.375rem;
63
+ --text-lg: 1.0625rem; /* 17px — emphasized body, section headings */
64
+ --text-lg--line-height: 1.5rem;
59
65
  --text-xl: 1.3125rem; /* 21px — page titles */
60
66
  --text-xl--line-height: 1.75rem;
61
67
  --text-2xl: 1.625rem; /* 26px — display */
@@ -138,13 +144,16 @@
138
144
  to these system-wide. JS mirror: src/lib/motion.ts — keep in sync. */
139
145
  --ease-out: cubic-bezier(0.23, 1, 0.32, 1); /* entrances, exits, presses */
140
146
  --ease-in-out: cubic-bezier(0.77, 0, 0.175, 1); /* on-screen movement / morphs */
141
- --ease-drawer: cubic-bezier(0.32, 0.72, 0, 1); /* iOS-like drawer slide */
147
+ --ease-expo-out: cubic-bezier(0.16, 1, 0.3, 1); /* side-panel and drawer slide */
148
+ --ease-drawer: var(--ease-expo-out); /* backwards-compatible alias */
142
149
  --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* playful overshoot (rare) */
150
+ --ease-disclosure: cubic-bezier(0.32, 0.72, 0, 1); /* height reveals — moves off the mark immediately, settles long */
143
151
 
144
152
  /* Durations — every animation/transition timing flows from these.
145
153
  UI animations stay under 300ms; exits run faster than enters. */
146
154
  --duration-fast: 0.15s; /* menu / popover / tooltip enter */
147
155
  --duration-normal: 0.2s; /* state transitions */
156
+ --duration-disclosure: 0.28s; /* collapsible open — travels a real distance */
148
157
  --duration-spin: 0.8s; /* rotation loops (spinner) */
149
158
  --duration-pulse: 1.5s; /* breathing / shimmer loops */
150
159
  --duration-bloom: 0.9s; /* ambient reveals (chat texture bloom, curtain wipe) */
@@ -166,6 +175,8 @@
166
175
  --sidebar-item: 2rem; /* 32px — collapsed rail hit target (square) */
167
176
  --sidebar-logo: 1.25rem; /* 20px — brand mark, centered in a --sidebar-item square */
168
177
  --sidebar-text-indent: 2.375rem; /* px-3 + icon size-4 + gap-2.5 — history rows align to nav-item text */
178
+ --sidebar-navigation-text-size: 0.8125rem; /* 13px — sidebar actions, items, history, and account text */
179
+ --sidebar-section-label-size: 0.8125rem; /* 13px — section and history labels */
169
180
  --panel-header-height: 2.75rem; /* 44px — Panel / toolbar header */
170
181
  --aside-width: 20rem; /* 320px — right-hand panel column */
171
182
 
@@ -180,6 +191,7 @@
180
191
  --composer-bg: color-mix(in oklab, var(--muted) 30%, var(--background));
181
192
  --composer-radius: var(--radius-2xl);
182
193
  --composer-padding: 0.5rem;
194
+ --composer-placeholder-max-h: calc(var(--text-base--line-height) * 2); /* rotating placeholder clamp — two lines of the input's own rhythm, so it can never overlap the accessory row */
183
195
  --chat-texture-opacity: 0.06; /* welcome-state halftone wash */
184
196
  }
185
197
 
@@ -313,10 +325,11 @@
313
325
  display: none;
314
326
  }
315
327
 
316
- /* Ask Actioneer texture entrance: a radial bloom — the halftone reveals from
317
- the centre out to the corners (clip-path circle) while gently scaling up to
318
- rest. `from{}`-only keyframe, so it settles into the element's own opacity. */
319
- @keyframes chat-texture-reveal {
328
+ /* BrandTexture entrance (src/components/brand-texture.tsx): a radial bloom —
329
+ the halftone reveals from the centre out to the corners (clip-path circle)
330
+ while gently scaling up to rest. `from{}`-only keyframe, so it settles into
331
+ the element's own opacity. */
332
+ @keyframes ads-texture-reveal {
320
333
  from {
321
334
  clip-path: circle(10% at 50% 50%);
322
335
  opacity: 0;
@@ -326,8 +339,8 @@
326
339
  clip-path: circle(102% at 50% 50%);
327
340
  }
328
341
  }
329
- .chat-texture-reveal {
330
- animation: chat-texture-reveal var(--duration-bloom) var(--ease-out) both;
342
+ .ads-texture-reveal {
343
+ animation: ads-texture-reveal var(--duration-bloom) var(--ease-out) both;
331
344
  }
332
345
 
333
346
  /* Paper's WebGL shader owns the halftone animation. The canvas is bounded to
@@ -371,7 +384,7 @@
371
384
  animation-direction: reverse;
372
385
  }
373
386
  @media (prefers-reduced-motion: reduce) {
374
- .chat-texture-reveal {
387
+ .ads-texture-reveal {
375
388
  animation: none;
376
389
  }
377
390
  .voice-surface-drift {
@@ -379,13 +392,13 @@
379
392
  }
380
393
  }
381
394
 
382
- /* Ask Actioneer texture exit — cloud lift. When the conversation starts the
395
+ /* BrandTexture exit — cloud lift. When the conversation starts the
383
396
  halftone dissolves from the BOTTOM upward (a soft mask band sweeps up
384
397
  through it) while the whole layer drifts up and fades — cloud cover
385
398
  breaking and rising, not a curtain covering it. The mask rests fully
386
399
  opaque (element aligned with the black end of an oversized gradient), and
387
400
  the lifted state slides the element to the transparent end. */
388
- .chat-texture-lift {
401
+ .ads-texture-lift {
389
402
  mask-image: linear-gradient(to top, transparent 0%, transparent 42%, black 58%, black 100%);
390
403
  -webkit-mask-image: linear-gradient(to top, transparent 0%, transparent 42%, black 58%, black 100%);
391
404
  mask-repeat: no-repeat;
@@ -400,16 +413,16 @@
400
413
  translate 1s var(--ease-out),
401
414
  opacity 1s var(--ease-out);
402
415
  }
403
- .chat-texture-lifted {
416
+ .ads-texture-lifted {
404
417
  mask-position: 0% 100%;
405
418
  -webkit-mask-position: 0% 100%;
406
419
  translate: 0 -3.5rem;
407
420
  }
408
421
  @media (prefers-reduced-motion: reduce) {
409
- .chat-texture-lift {
422
+ .ads-texture-lift {
410
423
  transition: opacity var(--duration-normal) var(--ease-out);
411
424
  }
412
- .chat-texture-lifted {
425
+ .ads-texture-lifted {
413
426
  mask-position: 0% 0%;
414
427
  -webkit-mask-position: 0% 0%;
415
428
  translate: none;
@@ -470,7 +483,7 @@
470
483
  background-color: var(--background);
471
484
  color: var(--foreground);
472
485
  font-family: var(--font-sans);
473
- font-size: var(--text-base); /* 14px base */
486
+ font-size: var(--text-base); /* 15px base */
474
487
  font-feature-settings: "cv01", "ss01";
475
488
  font-synthesis-weight: none;
476
489
  }
@@ -533,6 +546,44 @@
533
546
  @keyframes ads-shimmer {
534
547
  100% { transform: translateX(100%); }
535
548
  }
549
+
550
+ /* Reveal — the "data draws itself" entrance (src/components/reveal.tsx).
551
+ The real layout lands instantly; content arrives in hierarchy — shells
552
+ rise, labels/values ink in, visualizations wipe left→right — each slot
553
+ delayed by --reveal-order × --reveal-step. The wipe runs longer than UI
554
+ chrome on purpose: data drawing is explanatory motion, not chrome. */
555
+ @keyframes ads-reveal-ink {
556
+ from { opacity: 0; filter: blur(4px); }
557
+ to { opacity: 1; filter: blur(0); }
558
+ }
559
+ @keyframes ads-reveal-rise {
560
+ from { opacity: 0; transform: translate3d(0, 8px, 0); }
561
+ to { opacity: 1; transform: translate3d(0, 0, 0); }
562
+ }
563
+ @keyframes ads-reveal-wipe {
564
+ from { clip-path: inset(0 100% 0 0); }
565
+ to { clip-path: inset(0 0 0 0); }
566
+ }
567
+ @keyframes ads-reveal-fade {
568
+ from { opacity: 0; }
569
+ to { opacity: 1; }
570
+ }
571
+ .ads-reveal {
572
+ animation: ads-reveal-rise var(--reveal-duration, 0.45s) var(--ease-out) both;
573
+ animation-delay: calc(var(--reveal-step, 70ms) * var(--reveal-order, 0));
574
+ }
575
+ .ads-reveal-ink { animation-name: ads-reveal-ink; }
576
+ .ads-reveal-wipe {
577
+ animation-name: ads-reveal-wipe;
578
+ animation-duration: var(--reveal-duration-draw, 0.9s);
579
+ }
580
+ @media (prefers-reduced-motion: reduce) {
581
+ .ads-reveal,
582
+ .ads-reveal-ink,
583
+ .ads-reveal-wipe {
584
+ animation-name: ads-reveal-fade;
585
+ }
586
+ }
536
587
  @keyframes ads-indeterminate {
537
588
  0% { transform: translate3d(-100%, 0, 0); }
538
589
  60%, 100% { transform: translate3d(250%, 0, 0); }
@@ -649,5 +700,103 @@
649
700
  animation: none !important;
650
701
  }
651
702
  }
703
+
704
+ /* Collapsible disclosure (CSS path) — opt-in via .ads-collapsible for simple
705
+ disclosures. ChainOfThoughtContent does NOT use this: it animates with
706
+ Motion so a toggle mid-flight reverses from the current height instead of
707
+ restarting, which CSS keyframes cannot do.
708
+
709
+ Height, opacity and a short rise in ONE animation.
710
+ Two separate `animation` declarations cannot coexist (the shorthand replaces,
711
+ it does not merge), so animating height alongside tw-animate-css's enter/exit
712
+ silently drops the fade and leaves a bare height shutter — which reads as
713
+ rigid no matter how it is timed. Radix publishes the measured height as
714
+ --radix-collapsible-content-height; exits run faster than enters.
715
+ Eased with --ease-disclosure. --ease-out front-loads ~60% of the travel into
716
+ the first third (pop, then settle); --ease-in-out holds ~150ms before moving
717
+ (lag, then rush). A height reveal needs to leave the mark immediately and
718
+ settle long, which is what this curve does. */
719
+ @keyframes ads-collapsible-down {
720
+ from {
721
+ height: 0;
722
+ opacity: 0;
723
+ transform: translate3d(0, -4px, 0);
724
+ }
725
+ to {
726
+ height: var(--radix-collapsible-content-height);
727
+ opacity: 1;
728
+ transform: translate3d(0, 0, 0);
729
+ }
730
+ }
731
+ @keyframes ads-collapsible-up {
732
+ from {
733
+ height: var(--radix-collapsible-content-height);
734
+ opacity: 1;
735
+ transform: translate3d(0, 0, 0);
736
+ }
737
+ to {
738
+ height: 0;
739
+ opacity: 0;
740
+ transform: translate3d(0, -4px, 0);
741
+ }
742
+ }
743
+ .ads-collapsible[data-state="open"] {
744
+ animation: ads-collapsible-down var(--duration-disclosure) var(--ease-disclosure);
745
+ }
746
+ .ads-collapsible[data-state="closed"] {
747
+ animation: ads-collapsible-up var(--duration-normal) var(--ease-disclosure);
748
+ }
749
+ @media (prefers-reduced-motion: reduce) {
750
+ .ads-collapsible[data-state="open"],
751
+ .ads-collapsible[data-state="closed"] {
752
+ animation: none;
753
+ }
754
+ }
755
+
756
+ /* Tree connector — the rail that links a group of children back to their
757
+ parent, and the L-shaped elbow that reaches an individual child.
758
+
759
+ Two classes so a rail can pass THROUGH content that is not itself a branch:
760
+ `.ads-tree-rail` draws the vertical only, `.ads-tree-branch` adds the elbow.
761
+ Mixing them keeps the rail unbroken from the parent icon while only the
762
+ rows that are actual children get an elbow.
763
+
764
+ - --tree-rail-lead : how far the FIRST child's rail climbs to meet the
765
+ parent row.
766
+ - --tree-elbow : where the elbow meets the child — its icon centre. */
767
+ .ads-tree-rail,
768
+ .ads-tree-branch {
769
+ position: relative;
770
+ padding-inline-start: 1.25rem;
771
+ }
772
+ .ads-tree-rail::before,
773
+ .ads-tree-branch::before {
774
+ content: "";
775
+ position: absolute;
776
+ inset-block: 0;
777
+ left: 0;
778
+ border-left: 1px solid var(--border);
779
+ }
780
+ .ads-tree-rail:first-child::before,
781
+ .ads-tree-branch:first-child::before {
782
+ top: calc(-1 * var(--tree-rail-lead, 0px));
783
+ }
784
+ /* The last child needs no rail: its elbow (or the content's end) terminates
785
+ the branch, and a rail there pokes through the curve. */
786
+ .ads-tree-rail:last-child::before,
787
+ .ads-tree-branch:last-child::before {
788
+ display: none;
789
+ }
790
+ .ads-tree-branch::after {
791
+ content: "";
792
+ position: absolute;
793
+ left: 0;
794
+ top: 0;
795
+ height: var(--tree-elbow, 1.125rem);
796
+ width: 1rem;
797
+ border-bottom: 1px solid var(--border);
798
+ border-left: 1px solid var(--border);
799
+ border-bottom-left-radius: 9px;
800
+ }
652
801
  /* Let the consumer's Tailwind discover the classes ADS components use. */
653
802
  @source "./**/*.{js,mjs}";
package/theme.css CHANGED
@@ -7,28 +7,34 @@
7
7
  */
8
8
  @theme {
9
9
  /* ---- Typography ----
10
- One typeface only. No monospace font — numeric/code contexts use
11
- Aribau Grotesk with `tabular-nums` for aligned figures. */
10
+ One brand typeface. Figures inside prose stay in Aribau Grotesk with
11
+ `tabular-nums`; only literal source code steps to the mono stack. */
12
12
  --font-sans: "Aribau Grotesk", ui-sans-serif, system-ui, -apple-system,
13
13
  "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
14
14
 
15
- /* ---- Type scale ---- base = 14px (0.875rem). Root stays 16px so the
16
- spacing grid is unaffected; only text sizes are anchored to 14px. */
15
+ /* Source code only (CodeBlock, inline Code). ADS ships no mono webfont —
16
+ this resolves to the reader's platform mono, which is what a developer
17
+ already reads code in. Never use it for UI copy or data. */
18
+ --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
19
+ "Liberation Mono", "Courier New", monospace;
20
+
21
+ /* ---- Type scale ---- base = 15px (0.9375rem). Root stays 16px so the
22
+ spacing grid is unaffected; only text sizes are anchored to 15px. */
17
23
  /* SIX sizes only — a deliberately small ladder (captions → display).
18
24
  Don't reintroduce 2xs/3xl/4xl or in-between steps; if a size feels
19
25
  missing, the answer is weight/color, not a new size. */
20
- --text-xs: 0.75rem; /* 12px — captions, secondary text, table cells, keycaps */
21
- --text-xs--line-height: 1rem;
22
- /* text-sm is aliased to text-xs (both 12px). The scale is intentionally
23
- 12 · 14 · 15 · 21 · 26 with no in-between tier — keeping the token
24
- pointed at 12px stops any stray `text-sm` from falling back to
25
- Tailwind's default 14px, which would silently read as base. */
26
- --text-sm: 0.75rem;
27
- --text-sm--line-height: 1rem;
28
- --text-base: 0.875rem; /* 14px — BASE body */
29
- --text-base--line-height: 1.25rem;
30
- --text-lg: 0.9375rem; /* 15px — emphasized body, section headings */
31
- --text-lg--line-height: 1.375rem;
26
+ --text-xs: 0.8125rem; /* 13px — the FLOOR: captions, secondary text, table cells, keycaps */
27
+ --text-xs--line-height: 1.125rem;
28
+ /* text-sm is aliased to text-xs (both 13px). The scale is intentionally
29
+ 13 · 15 · 17 · 21 · 26 with no in-between tier — keeping the token
30
+ pointed at 13px stops any stray `text-sm` from falling back to
31
+ Tailwind's default 14px, which would land off the scale. */
32
+ --text-sm: 0.8125rem;
33
+ --text-sm--line-height: 1.125rem;
34
+ --text-base: 0.9375rem; /* 15px — BASE body */
35
+ --text-base--line-height: 1.375rem;
36
+ --text-lg: 1.0625rem; /* 17px — emphasized body, section headings */
37
+ --text-lg--line-height: 1.5rem;
32
38
  --text-xl: 1.3125rem; /* 21px — page titles */
33
39
  --text-xl--line-height: 1.75rem;
34
40
  --text-2xl: 1.625rem; /* 26px — display */
@@ -111,13 +117,16 @@
111
117
  to these system-wide. JS mirror: src/lib/motion.ts — keep in sync. */
112
118
  --ease-out: cubic-bezier(0.23, 1, 0.32, 1); /* entrances, exits, presses */
113
119
  --ease-in-out: cubic-bezier(0.77, 0, 0.175, 1); /* on-screen movement / morphs */
114
- --ease-drawer: cubic-bezier(0.32, 0.72, 0, 1); /* iOS-like drawer slide */
120
+ --ease-expo-out: cubic-bezier(0.16, 1, 0.3, 1); /* side-panel and drawer slide */
121
+ --ease-drawer: var(--ease-expo-out); /* backwards-compatible alias */
115
122
  --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* playful overshoot (rare) */
123
+ --ease-disclosure: cubic-bezier(0.32, 0.72, 0, 1); /* height reveals — moves off the mark immediately, settles long */
116
124
 
117
125
  /* Durations — every animation/transition timing flows from these.
118
126
  UI animations stay under 300ms; exits run faster than enters. */
119
127
  --duration-fast: 0.15s; /* menu / popover / tooltip enter */
120
128
  --duration-normal: 0.2s; /* state transitions */
129
+ --duration-disclosure: 0.28s; /* collapsible open — travels a real distance */
121
130
  --duration-spin: 0.8s; /* rotation loops (spinner) */
122
131
  --duration-pulse: 1.5s; /* breathing / shimmer loops */
123
132
  --duration-bloom: 0.9s; /* ambient reveals (chat texture bloom, curtain wipe) */
@@ -139,6 +148,8 @@
139
148
  --sidebar-item: 2rem; /* 32px — collapsed rail hit target (square) */
140
149
  --sidebar-logo: 1.25rem; /* 20px — brand mark, centered in a --sidebar-item square */
141
150
  --sidebar-text-indent: 2.375rem; /* px-3 + icon size-4 + gap-2.5 — history rows align to nav-item text */
151
+ --sidebar-navigation-text-size: 0.8125rem; /* 13px — sidebar actions, items, history, and account text */
152
+ --sidebar-section-label-size: 0.8125rem; /* 13px — section and history labels */
142
153
  --panel-header-height: 2.75rem; /* 44px — Panel / toolbar header */
143
154
  --aside-width: 20rem; /* 320px — right-hand panel column */
144
155
 
@@ -153,6 +164,7 @@
153
164
  --composer-bg: color-mix(in oklab, var(--muted) 30%, var(--background));
154
165
  --composer-radius: var(--radius-2xl);
155
166
  --composer-padding: 0.5rem;
167
+ --composer-placeholder-max-h: calc(var(--text-base--line-height) * 2); /* rotating placeholder clamp — two lines of the input's own rhythm, so it can never overlap the accessory row */
156
168
  --chat-texture-opacity: 0.06; /* welcome-state halftone wash */
157
169
  }
158
170
 
@@ -1,15 +0,0 @@
1
- import { ComponentProps, ReactNode } from 'react';
2
- import { Renderer } from '@openuidev/react-lang';
3
- /**
4
- * The OpenUI Lang library used to render fenced `openui-lang` answers. ADS
5
- * ships no default library — the host injects its own component registry via
6
- * {@link OpenUiLibraryProvider}. Absent a provider, structured answers fall
7
- * back to Markdown (see {@link SmartMessageText}).
8
- */
9
- type OpenUiLibrary = ComponentProps<typeof Renderer>["library"];
10
- export declare function OpenUiLibraryProvider({ library, children, }: {
11
- library: OpenUiLibrary;
12
- children: ReactNode;
13
- }): import("react").JSX.Element;
14
- export declare const SmartMessageText: import('react').MemoExoticComponent<() => import("react").JSX.Element>;
15
- export {};
@@ -1,29 +0,0 @@
1
- "use client";
2
- import { jsx as t } from "react/jsx-runtime";
3
- import { createContext as c, memo as p, useContext as m } from "react";
4
- import { useMessagePartText as u } from "@assistant-ui/react";
5
- import { Renderer as d } from "@openuidev/react-lang";
6
- import { MarkdownText as l } from "./markdown-text.js";
7
- const i = c(null);
8
- function M({
9
- library: e,
10
- children: r
11
- }) {
12
- return /* @__PURE__ */ t(i.Provider, { value: e, children: r });
13
- }
14
- const x = /```openui-lang\r?\n([\s\S]*?)(?:\r?\n```|$)/;
15
- function f(e) {
16
- const r = e.match(x);
17
- return r ? r[1].replace(/```$/, "").trimEnd() : null;
18
- }
19
- const g = () => {
20
- var o;
21
- const e = u(), r = m(i), s = e.type === "text" ? e.text : "", n = f(s), a = e.status.type === "running";
22
- return n && r ? /* @__PURE__ */ t("div", { className: "ads-openui my-1", children: /* @__PURE__ */ t(d, { response: n, library: r, isStreaming: a }) }) : (n && typeof process < "u" && ((o = process.env) == null ? void 0 : o.NODE_ENV) !== "production" && console.warn(
23
- "[ADS] SmartMessageText got an openui-lang answer but no OpenUiLibraryProvider is present; falling back to Markdown. Wrap the Thread in <OpenUiLibraryProvider library={…}>."
24
- ), /* @__PURE__ */ t(l, {}));
25
- }, P = p(g);
26
- export {
27
- M as OpenUiLibraryProvider,
28
- P as SmartMessageText
29
- };