@agentero/design-system 0.25.4 → 0.26.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.
@@ -588,13 +588,13 @@
588
588
  <header>
589
589
  <div class="wrap">
590
590
  <h1>Manifest Debugger</h1>
591
- <div class="summary"><a class="filter-pill all" data-k="all" href="#filter-all">All</a><span class="filter-pill ok" aria-disabled="true">25 components ok</span><span class="filter-pill ok" aria-disabled="true">194 stories ok</span></div>
591
+ <div class="summary"><a class="filter-pill all" data-k="all" href="#filter-all">All</a><span class="filter-pill ok" aria-disabled="true">26 components ok</span><span class="filter-pill ok" aria-disabled="true">204 stories ok</span></div>
592
592
  </div>
593
593
  </header>
594
594
  <main>
595
595
  <div class="wrap">
596
596
  <div class="note ok" style="margin-bottom: 16px;">
597
- Using <code>react-component-meta</code>. Generation took <strong>3.3s</strong>.
597
+ Using <code>react-component-meta</code>. Generation took <strong>5.6s</strong>.
598
598
  </div>
599
599
  <h2 class="section-title">Components</h2>
600
600
  <div class="grid" role="list">
@@ -2580,7 +2580,7 @@ import { CheckList } from &#39;@agentero/design-system/check-list&#39;;
2580
2580
  <div class="badges">
2581
2581
  <label for="c-6-components-command-props" class="badge ok as-toggle">10 prop types</label>
2582
2582
 
2583
- <label for="c-6-components-command-stories" class="badge ok as-toggle">5 stories</label>
2583
+ <label for="c-6-components-command-stories" class="badge ok as-toggle">6 stories</label>
2584
2584
 
2585
2585
 
2586
2586
  </div>
@@ -2791,6 +2791,26 @@ and `scroll-py-2` keeps that row off the container edges.</div>
2791
2791
  &lt;/Command.Item&gt;
2792
2792
  &lt;/Command.List&gt;
2793
2793
  &lt;Command.Empty&gt;No results found.&lt;/Command.Empty&gt;
2794
+ &lt;/Command.Root&gt;;</code></pre>
2795
+ </div>
2796
+ <div class="note ok">
2797
+ <div class="row">
2798
+ <span class="ex-name">Disabled Item</span>
2799
+ <span class="badge ok">story ok</span>
2800
+ </div>
2801
+
2802
+ <div class="hint">A `disabled` row stays visible and searchable but cannot be chosen. cmdk skips it with the
2803
+ arrow keys and swallows the click, and the row drops its hover and active styling so the
2804
+ list does not invite the pointer.</div>
2805
+ <pre><code>const DisabledItem = () =&gt; &lt;Command.Root label=&quot;Search agencies&quot;&gt;
2806
+ &lt;Command.Input placeholder=&quot;Search...&quot; /&gt;
2807
+ &lt;Command.List&gt;
2808
+ &lt;Command.Item value=&quot;pinnacle&quot; onSelect={handleDisabledSelect}&gt;Pinnacle Shield Insurance
2809
+ &lt;/Command.Item&gt;
2810
+ &lt;Command.Item value=&quot;horizon&quot; disabled onSelect={handleDisabledSelect}&gt;Horizon Risk Solutions
2811
+ &lt;/Command.Item&gt;
2812
+ &lt;/Command.List&gt;
2813
+ &lt;Command.Empty&gt;No results found.&lt;/Command.Empty&gt;
2794
2814
  &lt;/Command.Root&gt;;</code></pre>
2795
2815
  </div>
2796
2816
  </div>
@@ -4504,6 +4524,245 @@ trigger-dense UIs where an instant preview reads as more responsive.</div>
4504
4524
  </div>
4505
4525
 
4506
4526
 
4527
+ </div>
4528
+ </article>
4529
+ <article
4530
+ class="card
4531
+ no-error
4532
+ no-info
4533
+ no-story-error
4534
+ no-doc-error"
4535
+ role="listitem"
4536
+ aria-label="Input">
4537
+ <div class="head">
4538
+ <div class="title">
4539
+ <h2><span class="status-dot dot-ok"></span> Input</h2>
4540
+ <div class="badges">
4541
+ <label for="c-11-components-input-props" class="badge ok as-toggle">7 prop types</label>
4542
+
4543
+ <label for="c-11-components-input-stories" class="badge ok as-toggle">9 stories</label>
4544
+
4545
+
4546
+ </div>
4547
+ </div>
4548
+ <div class="meta" title="./src/input/input.stories.tsx">components-input · ./src/input/input.stories.tsx</div>
4549
+ <div>Base single-line text control, unaware of fields and form libraries</div>
4550
+ <div class="hint">Input is the base single-line text control. It is intentionally unaware of
4551
+ form fields and form libraries: `id`, `aria-invalid` and `aria-describedby`
4552
+ are plain props, set by a field wrapper or by hand.
4553
+
4554
+ There is no `status` prop. Mark the control `aria-invalid` and the
4555
+ destructive border follows, so the styling can never disagree with what
4556
+ assistive technology announces.</div>
4557
+ <div class="kv"><span class="chip">summary: Base single-line text control, unaware of fields and form libraries</span><span class="chip">example: &lt;Label htmlFor=&quot;email&quot;&gt;Email&lt;/Label&gt;
4558
+ &lt;Input id=&quot;email&quot; type=&quot;email&quot; placeholder=&quot;you@example.com&quot; /&gt;</span><span class="chip">example: &lt;Input id=&quot;email&quot; aria-invalid aria-describedby=&quot;email-error&quot; /&gt;
4559
+ &lt;span id=&quot;email-error&quot;&gt;Enter a valid email address.&lt;/span&gt;</span></div>
4560
+ </div>
4561
+
4562
+ <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
4563
+
4564
+
4565
+ <input id="c-11-components-input-stories" class="tg tg-stories" type="checkbox" hidden />
4566
+
4567
+
4568
+ <input id="c-11-components-input-props" class="tg tg-props" type="checkbox" hidden />
4569
+
4570
+ <div class="panels">
4571
+
4572
+
4573
+
4574
+ <div class="panel panel-props">
4575
+ <div class="note ok">
4576
+ <div class="row">
4577
+ <span class="ex-name">Prop types <small>(react-component-meta)</small></span>
4578
+ <span class="badge ok">7 prop types</span>
4579
+ </div>
4580
+ <pre><code>Component: src/input/input.tsx::Input</code></pre>
4581
+ <pre><code>Props:</code></pre>
4582
+ <pre><code>/**
4583
+ * Indicates the entered value does not conform to the format expected by the application.
4584
+ * Set this when the value fails validation: it drives the destructive border
4585
+ * and is what assistive technology announces. Point `aria-describedby` at
4586
+ * the error message so the two are read together.
4587
+ */
4588
+ aria-invalid?: boolean | &quot;true&quot; | &quot;false&quot; | &quot;grammar&quot; | &quot;spelling&quot; | undefined
4589
+
4590
+ /**
4591
+ * Blocks interaction, greys the control out and drops its shadow. The value
4592
+ * is not submitted. When the user still needs to read or copy the value,
4593
+ * use `readOnly` instead.
4594
+ */
4595
+ disabled?: boolean
4596
+
4597
+ /**
4598
+ * Short hint shown while the field is empty. It disappears on the first
4599
+ * keystroke, so it is never a substitute for a label.
4600
+ */
4601
+ placeholder?: string
4602
+
4603
+ /**
4604
+ * Keeps the value focusable and copyable but not editable, and still
4605
+ * submits it. Unlike `disabled`, it stays in the tab order.
4606
+ */
4607
+ readOnly?: boolean
4608
+
4609
+ /**
4610
+ * Marks the control required for both the browser and assistive technology.
4611
+ */
4612
+ required?: boolean
4613
+
4614
+ /**
4615
+ * Control height. Defaults to `&#39;md&#39;`.
4616
+ * - `sm` (32px) — dense layouts where vertical space is tight.
4617
+ * - `md` (40px) — standard form density.
4618
+ * - `lg` (48px) — low-density forms and larger touch targets. Also raises
4619
+ * the text to `base` and the corner radius to `lg`.
4620
+ */
4621
+ size?: &quot;sm&quot; | &quot;md&quot; | &quot;lg&quot;
4622
+
4623
+ /**
4624
+ * Native input type. Picks the on-screen keyboard on touch devices and the
4625
+ * browser&#39;s own parsing, so set it even when you validate yourself.
4626
+ * Defaults to `&#39;text&#39;`. Multi-line text is not one of the options — that is
4627
+ * a TextArea.
4628
+ */
4629
+ type?: HTMLInputTypeAttribute | undefined</code></pre>
4630
+ </div>
4631
+ </div>
4632
+
4633
+ <div class="panel panel-stories">
4634
+
4635
+
4636
+
4637
+ <div class="note ok">
4638
+ <div class="row">
4639
+ <span class="ex-name">Imports</span>
4640
+ </div>
4641
+ <pre><code>import { Input } from "@agentero/design-system";</code></pre>
4642
+ </div>
4643
+
4644
+
4645
+ <div class="note ok">
4646
+ <div class="row">
4647
+ <span class="ex-name">Default</span>
4648
+ <span class="badge ok">story ok</span>
4649
+ </div>
4650
+ <div>Default standalone input</div>
4651
+ <div class="hint">The default control at `md`, usable anywhere without a surrounding field.</div>
4652
+ <pre><code>const Default = () =&gt; &lt;Input type=&quot;text&quot; placeholder=&quot;Insert value&quot; aria-label=&quot;Value&quot; /&gt;;</code></pre>
4653
+ </div>
4654
+ <div class="note ok">
4655
+ <div class="row">
4656
+ <span class="ex-name">Small</span>
4657
+ <span class="badge ok">story ok</span>
4658
+ </div>
4659
+ <div>Small 32px control for dense layouts</div>
4660
+ <div class="hint">`sm` (32px) keeps dense layouts compact where vertical space is tight.</div>
4661
+ <pre><code>const Small = () =&gt; &lt;Input type=&quot;text&quot; placeholder=&quot;Insert value&quot; aria-label=&quot;Value&quot; size=&quot;sm&quot; /&gt;;</code></pre>
4662
+ </div>
4663
+ <div class="note ok">
4664
+ <div class="row">
4665
+ <span class="ex-name">Medium</span>
4666
+ <span class="badge ok">story ok</span>
4667
+ </div>
4668
+ <div>Medium 40px control, the default</div>
4669
+ <div class="hint">`md` (40px) is the default and covers standard form density.</div>
4670
+ <pre><code>const Medium = () =&gt; &lt;Input type=&quot;text&quot; placeholder=&quot;Insert value&quot; aria-label=&quot;Value&quot; size=&quot;md&quot; /&gt;;</code></pre>
4671
+ </div>
4672
+ <div class="note ok">
4673
+ <div class="row">
4674
+ <span class="ex-name">Large</span>
4675
+ <span class="badge ok">story ok</span>
4676
+ </div>
4677
+ <div>Large 48px control for low-density forms</div>
4678
+ <div class="hint">`lg` (48px) suits low-density forms and larger touch targets. It also raises
4679
+ the text to `base` and the corner radius to `lg`.</div>
4680
+ <pre><code>const Large = () =&gt; &lt;Input type=&quot;text&quot; placeholder=&quot;Insert value&quot; aria-label=&quot;Value&quot; size=&quot;lg&quot; /&gt;;</code></pre>
4681
+ </div>
4682
+ <div class="note ok">
4683
+ <div class="row">
4684
+ <span class="ex-name">All Sizes</span>
4685
+ <span class="badge ok">story ok</span>
4686
+ </div>
4687
+ <div>Visual comparison of the three input sizes</div>
4688
+ <div class="hint">All three heights together for visual comparison.</div>
4689
+ <pre><code>const AllSizes = () =&gt; &lt;div style={{ display: &#39;grid&#39;, gap: &#39;1rem&#39;, maxWidth: &#39;20rem&#39; }}&gt;
4690
+ &lt;Input type=&quot;text&quot; size=&quot;sm&quot; aria-label=&quot;Small input&quot; placeholder=&quot;sm — 32px&quot; /&gt;
4691
+ &lt;Input type=&quot;text&quot; size=&quot;md&quot; aria-label=&quot;Medium input&quot; placeholder=&quot;md — 40px&quot; /&gt;
4692
+ &lt;Input type=&quot;text&quot; size=&quot;lg&quot; aria-label=&quot;Large input&quot; placeholder=&quot;lg — 48px&quot; /&gt;
4693
+ &lt;/div&gt;;</code></pre>
4694
+ </div>
4695
+ <div class="note ok">
4696
+ <div class="row">
4697
+ <span class="ex-name">Types</span>
4698
+ <span class="badge ok">story ok</span>
4699
+ </div>
4700
+ <div>Common input types side by side</div>
4701
+ <div class="hint">A range of input types. The type picks the on-screen keyboard on touch
4702
+ devices and the browser&#39;s own parsing, so set it even when you validate
4703
+ yourself.</div>
4704
+ <pre><code>const Types = () =&gt; &lt;div style={{ display: &#39;grid&#39;, gap: &#39;1rem&#39;, maxWidth: &#39;20rem&#39; }}&gt;
4705
+ &lt;Input type=&quot;text&quot; aria-label=&quot;Text&quot; placeholder=&quot;Text&quot; /&gt;
4706
+ &lt;Input type=&quot;email&quot; aria-label=&quot;Email address&quot; placeholder=&quot;you@example.com&quot; /&gt;
4707
+ &lt;Input type=&quot;password&quot; aria-label=&quot;Password&quot; placeholder=&quot;Password&quot; /&gt;
4708
+ &lt;Input type=&quot;number&quot; aria-label=&quot;Amount&quot; placeholder=&quot;0&quot; /&gt;
4709
+ &lt;Input type=&quot;date&quot; aria-label=&quot;Date&quot; placeholder=&quot;&quot; /&gt;
4710
+ &lt;/div&gt;;</code></pre>
4711
+ </div>
4712
+ <div class="note ok">
4713
+ <div class="row">
4714
+ <span class="ex-name">Invalid</span>
4715
+ <span class="badge ok">story ok</span>
4716
+ </div>
4717
+ <div>Invalid state driven by aria-invalid</div>
4718
+ <div class="hint">The invalid treatment comes purely from `aria-invalid`, so the border can
4719
+ never disagree with what assistive technology announces. Point
4720
+ `aria-describedby` at the message so it is read out with the control.</div>
4721
+ <pre><code>const Invalid = () =&gt; &lt;div style={{ display: &#39;grid&#39;, gap: &#39;0.25rem&#39;, maxWidth: &#39;20rem&#39; }}&gt;
4722
+ &lt;Input
4723
+ type=&quot;email&quot;
4724
+ placeholder=&quot;Insert value&quot;
4725
+ aria-label=&quot;Email&quot;
4726
+ aria-invalid
4727
+ aria-describedby=&quot;email-error&quot;
4728
+ defaultValue=&quot;not-an-email&quot; /&gt;
4729
+ &lt;span id=&quot;email-error&quot;&gt;Enter a valid email address.&lt;/span&gt;
4730
+ &lt;/div&gt;;</code></pre>
4731
+ </div>
4732
+ <div class="note ok">
4733
+ <div class="row">
4734
+ <span class="ex-name">Disabled</span>
4735
+ <span class="badge ok">story ok</span>
4736
+ </div>
4737
+ <div>Disabled state</div>
4738
+ <div class="hint">A disabled input keeps its value readable but blocks interaction, drops its
4739
+ shadow and leaves the tab order.</div>
4740
+ <pre><code>const Disabled = () =&gt; &lt;Input
4741
+ type=&quot;text&quot;
4742
+ placeholder=&quot;Insert value&quot;
4743
+ aria-label=&quot;Value&quot;
4744
+ disabled
4745
+ defaultValue=&quot;Cannot be edited&quot; /&gt;;</code></pre>
4746
+ </div>
4747
+ <div class="note ok">
4748
+ <div class="row">
4749
+ <span class="ex-name">Read Only</span>
4750
+ <span class="badge ok">story ok</span>
4751
+ </div>
4752
+ <div>Read-only value that stays focusable and copyable</div>
4753
+ <div class="hint">Read-only inputs stay focusable and copyable and still submit their value —
4754
+ reach for this over `disabled` when the user needs to read or copy something
4755
+ they cannot change.</div>
4756
+ <pre><code>const ReadOnly = () =&gt; &lt;Input
4757
+ type=&quot;text&quot;
4758
+ placeholder=&quot;Insert value&quot;
4759
+ aria-label=&quot;Value&quot;
4760
+ readOnly
4761
+ defaultValue=&quot;Copy me, but do not change me&quot; /&gt;;</code></pre>
4762
+ </div>
4763
+ </div>
4764
+
4765
+
4507
4766
  </div>
4508
4767
  </article>
4509
4768
  <article
@@ -4518,9 +4777,9 @@ trigger-dense UIs where an instant preview reads as more responsive.</div>
4518
4777
  <div class="title">
4519
4778
  <h2><span class="status-dot dot-ok"></span> Label</h2>
4520
4779
  <div class="badges">
4521
- <label for="c-11-components-label-props" class="badge ok as-toggle">3 prop types</label>
4780
+ <label for="c-12-components-label-props" class="badge ok as-toggle">3 prop types</label>
4522
4781
 
4523
- <label for="c-11-components-label-stories" class="badge ok as-toggle">4 stories</label>
4782
+ <label for="c-12-components-label-stories" class="badge ok as-toggle">4 stories</label>
4524
4783
 
4525
4784
 
4526
4785
  </div>
@@ -4540,10 +4799,10 @@ still has to carry `required` / `aria-required`.</div>
4540
4799
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
4541
4800
 
4542
4801
 
4543
- <input id="c-11-components-label-stories" class="tg tg-stories" type="checkbox" hidden />
4802
+ <input id="c-12-components-label-stories" class="tg tg-stories" type="checkbox" hidden />
4544
4803
 
4545
4804
 
4546
- <input id="c-11-components-label-props" class="tg tg-props" type="checkbox" hidden />
4805
+ <input id="c-12-components-label-props" class="tg tg-props" type="checkbox" hidden />
4547
4806
 
4548
4807
  <div class="panels">
4549
4808
 
@@ -4641,9 +4900,9 @@ dropped, so a mistake never takes the page down.</div>
4641
4900
  <div class="title">
4642
4901
  <h2><span class="status-dot dot-ok"></span> Loading</h2>
4643
4902
  <div class="badges">
4644
- <label for="c-12-components-loading-props" class="badge ok as-toggle">1 prop type</label>
4903
+ <label for="c-13-components-loading-props" class="badge ok as-toggle">1 prop type</label>
4645
4904
 
4646
- <label for="c-12-components-loading-stories" class="badge ok as-toggle">7 stories</label>
4905
+ <label for="c-13-components-loading-stories" class="badge ok as-toggle">7 stories</label>
4647
4906
 
4648
4907
 
4649
4908
  </div>
@@ -4660,10 +4919,10 @@ parent font size via `em`-based size variants (`sm`, `md`, `lg`).</div>
4660
4919
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
4661
4920
 
4662
4921
 
4663
- <input id="c-12-components-loading-stories" class="tg tg-stories" type="checkbox" hidden />
4922
+ <input id="c-13-components-loading-stories" class="tg tg-stories" type="checkbox" hidden />
4664
4923
 
4665
4924
 
4666
- <input id="c-12-components-loading-props" class="tg tg-props" type="checkbox" hidden />
4925
+ <input id="c-13-components-loading-props" class="tg tg-props" type="checkbox" hidden />
4667
4926
 
4668
4927
  <div class="panels">
4669
4928
 
@@ -4814,9 +5073,9 @@ against the dark background.</div>
4814
5073
  <div class="title">
4815
5074
  <h2><span class="status-dot dot-ok"></span> Modal.Root</h2>
4816
5075
  <div class="badges">
4817
- <label for="c-13-components-modal-props" class="badge ok as-toggle">5 prop types</label>
5076
+ <label for="c-14-components-modal-props" class="badge ok as-toggle">5 prop types</label>
4818
5077
 
4819
- <label for="c-13-components-modal-stories" class="badge ok as-toggle">6 stories</label>
5078
+ <label for="c-14-components-modal-stories" class="badge ok as-toggle">6 stories</label>
4820
5079
 
4821
5080
 
4822
5081
  </div>
@@ -4862,10 +5121,10 @@ import { Modal } from &#39;@agentero/design-system/modal&#39;;
4862
5121
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
4863
5122
 
4864
5123
 
4865
- <input id="c-13-components-modal-stories" class="tg tg-stories" type="checkbox" hidden />
5124
+ <input id="c-14-components-modal-stories" class="tg tg-stories" type="checkbox" hidden />
4866
5125
 
4867
5126
 
4868
- <input id="c-13-components-modal-props" class="tg tg-props" type="checkbox" hidden />
5127
+ <input id="c-14-components-modal-props" class="tg tg-props" type="checkbox" hidden />
4869
5128
 
4870
5129
  <div class="panels">
4871
5130
 
@@ -5062,9 +5321,9 @@ announced as an `alertdialog`. Only the footer actions close it.</div>
5062
5321
  <div class="title">
5063
5322
  <h2><span class="status-dot dot-ok"></span> Pagination</h2>
5064
5323
  <div class="badges">
5065
- <label for="c-14-components-pagination-props" class="badge ok as-toggle">5 prop types</label>
5324
+ <label for="c-15-components-pagination-props" class="badge ok as-toggle">5 prop types</label>
5066
5325
 
5067
- <label for="c-14-components-pagination-stories" class="badge ok as-toggle">7 stories</label>
5326
+ <label for="c-15-components-pagination-stories" class="badge ok as-toggle">7 stories</label>
5068
5327
 
5069
5328
 
5070
5329
  </div>
@@ -5094,10 +5353,10 @@ const [page, setPage] = useState(1);
5094
5353
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
5095
5354
 
5096
5355
 
5097
- <input id="c-14-components-pagination-stories" class="tg tg-stories" type="checkbox" hidden />
5356
+ <input id="c-15-components-pagination-stories" class="tg tg-stories" type="checkbox" hidden />
5098
5357
 
5099
5358
 
5100
- <input id="c-14-components-pagination-props" class="tg tg-props" type="checkbox" hidden />
5359
+ <input id="c-15-components-pagination-props" class="tg tg-props" type="checkbox" hidden />
5101
5360
 
5102
5361
  <div class="panels">
5103
5362
 
@@ -5252,9 +5511,9 @@ entries summary follow along.</div>
5252
5511
  <div class="title">
5253
5512
  <h2><span class="status-dot dot-ok"></span> Popover.Root</h2>
5254
5513
  <div class="badges">
5255
- <label for="c-15-components-popover-props" class="badge ok as-toggle">5 prop types</label>
5514
+ <label for="c-16-components-popover-props" class="badge ok as-toggle">5 prop types</label>
5256
5515
 
5257
- <label for="c-15-components-popover-stories" class="badge ok as-toggle">4 stories</label>
5516
+ <label for="c-16-components-popover-stories" class="badge ok as-toggle">4 stories</label>
5258
5517
 
5259
5518
 
5260
5519
  </div>
@@ -5283,10 +5542,10 @@ import { Popover } from &#39;@agentero/design-system/popover&#39;;
5283
5542
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
5284
5543
 
5285
5544
 
5286
- <input id="c-15-components-popover-stories" class="tg tg-stories" type="checkbox" hidden />
5545
+ <input id="c-16-components-popover-stories" class="tg tg-stories" type="checkbox" hidden />
5287
5546
 
5288
5547
 
5289
- <input id="c-15-components-popover-props" class="tg tg-props" type="checkbox" hidden />
5548
+ <input id="c-16-components-popover-props" class="tg tg-props" type="checkbox" hidden />
5290
5549
 
5291
5550
  <div class="panels">
5292
5551
 
@@ -5441,9 +5700,9 @@ useful when the visual anchor differs from the toggle button.</div>
5441
5700
  <div class="title">
5442
5701
  <h2><span class="status-dot dot-ok"></span> Progress</h2>
5443
5702
  <div class="badges">
5444
- <label for="c-16-components-progress-props" class="badge ok as-toggle">4 prop types</label>
5703
+ <label for="c-17-components-progress-props" class="badge ok as-toggle">4 prop types</label>
5445
5704
 
5446
- <label for="c-16-components-progress-stories" class="badge ok as-toggle">4 stories</label>
5705
+ <label for="c-17-components-progress-stories" class="badge ok as-toggle">4 stories</label>
5447
5706
 
5448
5707
 
5449
5708
  </div>
@@ -5462,10 +5721,10 @@ with `currentColor`, so recolor it with a plain text class — e.g.
5462
5721
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
5463
5722
 
5464
5723
 
5465
- <input id="c-16-components-progress-stories" class="tg tg-stories" type="checkbox" hidden />
5724
+ <input id="c-17-components-progress-stories" class="tg tg-stories" type="checkbox" hidden />
5466
5725
 
5467
5726
 
5468
- <input id="c-16-components-progress-props" class="tg tg-props" type="checkbox" hidden />
5727
+ <input id="c-17-components-progress-props" class="tg tg-props" type="checkbox" hidden />
5469
5728
 
5470
5729
  <div class="panels">
5471
5730
 
@@ -5584,7 +5843,7 @@ percentage: number</code></pre>
5584
5843
  <div class="badges">
5585
5844
 
5586
5845
 
5587
- <label for="c-17-components-skeleton-stories" class="badge ok as-toggle">4 stories</label>
5846
+ <label for="c-18-components-skeleton-stories" class="badge ok as-toggle">4 stories</label>
5588
5847
 
5589
5848
 
5590
5849
  </div>
@@ -5601,7 +5860,7 @@ shape it with Tailwind classes to mirror the content it stands in for.</div>
5601
5860
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
5602
5861
 
5603
5862
 
5604
- <input id="c-17-components-skeleton-stories" class="tg tg-stories" type="checkbox" hidden />
5863
+ <input id="c-18-components-skeleton-stories" class="tg tg-stories" type="checkbox" hidden />
5605
5864
 
5606
5865
 
5607
5866
 
@@ -5697,9 +5956,9 @@ shape it with Tailwind classes to mirror the content it stands in for.</div>
5697
5956
  <div class="title">
5698
5957
  <h2><span class="status-dot dot-ok"></span> Switch</h2>
5699
5958
  <div class="badges">
5700
- <label for="c-18-components-switch-props" class="badge ok as-toggle">8 prop types</label>
5959
+ <label for="c-19-components-switch-props" class="badge ok as-toggle">8 prop types</label>
5701
5960
 
5702
- <label for="c-18-components-switch-stories" class="badge ok as-toggle">7 stories</label>
5961
+ <label for="c-19-components-switch-stories" class="badge ok as-toggle">7 stories</label>
5703
5962
 
5704
5963
 
5705
5964
  </div>
@@ -5715,10 +5974,10 @@ a Checkbox for a single boolean that applies instantly, and pair it with a
5715
5974
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
5716
5975
 
5717
5976
 
5718
- <input id="c-18-components-switch-stories" class="tg tg-stories" type="checkbox" hidden />
5977
+ <input id="c-19-components-switch-stories" class="tg tg-stories" type="checkbox" hidden />
5719
5978
 
5720
5979
 
5721
- <input id="c-18-components-switch-props" class="tg tg-props" type="checkbox" hidden />
5980
+ <input id="c-19-components-switch-props" class="tg tg-props" type="checkbox" hidden />
5722
5981
 
5723
5982
  <div class="panels">
5724
5983
 
@@ -5899,9 +6158,9 @@ size?: &quot;sm&quot; | &quot;md&quot;</code></pre>
5899
6158
  <div class="title">
5900
6159
  <h2><span class="status-dot dot-ok"></span> Table.Root</h2>
5901
6160
  <div class="badges">
5902
- <label for="c-19-components-table-props" class="badge ok as-toggle">6 prop types</label>
6161
+ <label for="c-20-components-table-props" class="badge ok as-toggle">6 prop types</label>
5903
6162
 
5904
- <label for="c-19-components-table-stories" class="badge ok as-toggle">9 stories</label>
6163
+ <label for="c-20-components-table-stories" class="badge ok as-toggle">9 stories</label>
5905
6164
 
5906
6165
 
5907
6166
  </div>
@@ -5932,10 +6191,10 @@ import { Table } from &#39;@agentero/design-system/table&#39;;
5932
6191
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
5933
6192
 
5934
6193
 
5935
- <input id="c-19-components-table-stories" class="tg tg-stories" type="checkbox" hidden />
6194
+ <input id="c-20-components-table-stories" class="tg tg-stories" type="checkbox" hidden />
5936
6195
 
5937
6196
 
5938
- <input id="c-19-components-table-props" class="tg tg-props" type="checkbox" hidden />
6197
+ <input id="c-20-components-table-props" class="tg tg-props" type="checkbox" hidden />
5939
6198
 
5940
6199
  <div class="panels">
5941
6200
 
@@ -6130,9 +6389,9 @@ import { Fragment } from "react";</code></pre>
6130
6389
  <div class="title">
6131
6390
  <h2><span class="status-dot dot-ok"></span> Tabs.Root</h2>
6132
6391
  <div class="badges">
6133
- <label for="c-20-components-tabs-props" class="badge ok as-toggle">9 prop types</label>
6392
+ <label for="c-21-components-tabs-props" class="badge ok as-toggle">9 prop types</label>
6134
6393
 
6135
- <label for="c-20-components-tabs-stories" class="badge ok as-toggle">8 stories</label>
6394
+ <label for="c-21-components-tabs-stories" class="badge ok as-toggle">8 stories</label>
6136
6395
 
6137
6396
 
6138
6397
  </div>
@@ -6163,10 +6422,10 @@ import { Tabs } from &#39;@agentero/design-system/tabs&#39;;
6163
6422
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
6164
6423
 
6165
6424
 
6166
- <input id="c-20-components-tabs-stories" class="tg tg-stories" type="checkbox" hidden />
6425
+ <input id="c-21-components-tabs-stories" class="tg tg-stories" type="checkbox" hidden />
6167
6426
 
6168
6427
 
6169
- <input id="c-20-components-tabs-props" class="tg tg-props" type="checkbox" hidden />
6428
+ <input id="c-21-components-tabs-props" class="tg tg-props" type="checkbox" hidden />
6170
6429
 
6171
6430
  <div class="panels">
6172
6431
 
@@ -6387,9 +6646,9 @@ tablist role is announced.</div>
6387
6646
  <div class="title">
6388
6647
  <h2><span class="status-dot dot-ok"></span> Tag</h2>
6389
6648
  <div class="badges">
6390
- <label for="c-21-components-tag-props" class="badge ok as-toggle">8 prop types</label>
6649
+ <label for="c-22-components-tag-props" class="badge ok as-toggle">8 prop types</label>
6391
6650
 
6392
- <label for="c-21-components-tag-stories" class="badge ok as-toggle">12 stories</label>
6651
+ <label for="c-22-components-tag-stories" class="badge ok as-toggle">12 stories</label>
6393
6652
 
6394
6653
 
6395
6654
  </div>
@@ -6408,10 +6667,10 @@ it an interactive link or button, which adds the pointer cursor and hover fill.<
6408
6667
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
6409
6668
 
6410
6669
 
6411
- <input id="c-21-components-tag-stories" class="tg tg-stories" type="checkbox" hidden />
6670
+ <input id="c-22-components-tag-stories" class="tg tg-stories" type="checkbox" hidden />
6412
6671
 
6413
6672
 
6414
- <input id="c-21-components-tag-props" class="tg tg-props" type="checkbox" hidden />
6673
+ <input id="c-22-components-tag-props" class="tg tg-props" type="checkbox" hidden />
6415
6674
 
6416
6675
  <div class="panels">
6417
6676
 
@@ -6836,9 +7095,9 @@ leading + trailing icons, and icon-only.</div>
6836
7095
  <div class="title">
6837
7096
  <h2><span class="status-dot dot-ok"></span> Toast</h2>
6838
7097
  <div class="badges">
6839
- <label for="c-22-components-toast-props" class="badge ok as-toggle">11 prop types</label>
7098
+ <label for="c-23-components-toast-props" class="badge ok as-toggle">11 prop types</label>
6840
7099
 
6841
- <label for="c-22-components-toast-stories" class="badge ok as-toggle">11 stories</label>
7100
+ <label for="c-23-components-toast-stories" class="badge ok as-toggle">11 stories</label>
6842
7101
 
6843
7102
 
6844
7103
  </div>
@@ -6857,10 +7116,10 @@ common feedback patterns.</div>
6857
7116
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
6858
7117
 
6859
7118
 
6860
- <input id="c-22-components-toast-stories" class="tg tg-stories" type="checkbox" hidden />
7119
+ <input id="c-23-components-toast-stories" class="tg tg-stories" type="checkbox" hidden />
6861
7120
 
6862
7121
 
6863
- <input id="c-22-components-toast-props" class="tg tg-props" type="checkbox" hidden />
7122
+ <input id="c-23-components-toast-props" class="tg tg-props" type="checkbox" hidden />
6864
7123
 
6865
7124
  <div class="panels">
6866
7125
 
@@ -7289,9 +7548,9 @@ action (e.g., a sync icon for a sync-in-progress toast).</div>
7289
7548
  <div class="title">
7290
7549
  <h2><span class="status-dot dot-ok"></span> Tooltip</h2>
7291
7550
  <div class="badges">
7292
- <label for="c-23-components-tooltip-props" class="badge ok as-toggle">12 prop types</label>
7551
+ <label for="c-24-components-tooltip-props" class="badge ok as-toggle">12 prop types</label>
7293
7552
 
7294
- <label for="c-23-components-tooltip-stories" class="badge ok as-toggle">5 stories</label>
7553
+ <label for="c-24-components-tooltip-stories" class="badge ok as-toggle">5 stories</label>
7295
7554
 
7296
7555
 
7297
7556
  </div>
@@ -7310,10 +7569,10 @@ on hover or focus.</div>
7310
7569
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
7311
7570
 
7312
7571
 
7313
- <input id="c-23-components-tooltip-stories" class="tg tg-stories" type="checkbox" hidden />
7572
+ <input id="c-24-components-tooltip-stories" class="tg tg-stories" type="checkbox" hidden />
7314
7573
 
7315
7574
 
7316
- <input id="c-23-components-tooltip-props" class="tg tg-props" type="checkbox" hidden />
7575
+ <input id="c-24-components-tooltip-props" class="tg tg-props" type="checkbox" hidden />
7317
7576
 
7318
7577
  <div class="panels">
7319
7578
 
@@ -7485,9 +7744,9 @@ sideOffset?: number = 4</code></pre>
7485
7744
  <div class="title">
7486
7745
  <h2><span class="status-dot dot-ok"></span> ValidationList</h2>
7487
7746
  <div class="badges">
7488
- <label for="c-24-components-validationlist-props" class="badge ok as-toggle">2 prop types</label>
7747
+ <label for="c-25-components-validationlist-props" class="badge ok as-toggle">2 prop types</label>
7489
7748
 
7490
- <label for="c-24-components-validationlist-stories" class="badge ok as-toggle">4 stories</label>
7749
+ <label for="c-25-components-validationlist-stories" class="badge ok as-toggle">4 stories</label>
7491
7750
 
7492
7751
 
7493
7752
  </div>
@@ -7508,10 +7767,10 @@ your form validation; it does not own the input or block submission.</div>
7508
7767
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
7509
7768
 
7510
7769
 
7511
- <input id="c-24-components-validationlist-stories" class="tg tg-stories" type="checkbox" hidden />
7770
+ <input id="c-25-components-validationlist-stories" class="tg tg-stories" type="checkbox" hidden />
7512
7771
 
7513
7772
 
7514
- <input id="c-24-components-validationlist-props" class="tg tg-props" type="checkbox" hidden />
7773
+ <input id="c-25-components-validationlist-props" class="tg tg-props" type="checkbox" hidden />
7515
7774
 
7516
7775
  <div class="panels">
7517
7776
 
@@ -1923,6 +1923,12 @@
1923
1923
  "id": "components-command--keyboard-navigation",
1924
1924
  "name": "Keyboard Navigation",
1925
1925
  "snippet": "const KeyboardNavigation = () => <Command.Root label=\"Search commands\">\n <Command.Input placeholder=\"Search...\" />\n <Command.List>\n <Command.Item value=\"home\" keywords={['Homeowners']} onSelect={handleSelect}>Homeowners\n </Command.Item>\n <Command.Item value=\"auto\" keywords={['Auto']} onSelect={handleSelect}>Auto\n </Command.Item>\n </Command.List>\n <Command.Empty>No results found.</Command.Empty>\n</Command.Root>;"
1926
+ },
1927
+ {
1928
+ "id": "components-command--disabled-item",
1929
+ "name": "Disabled Item",
1930
+ "snippet": "const DisabledItem = () => <Command.Root label=\"Search agencies\">\n <Command.Input placeholder=\"Search...\" />\n <Command.List>\n <Command.Item value=\"pinnacle\" onSelect={handleDisabledSelect}>Pinnacle Shield Insurance\n </Command.Item>\n <Command.Item value=\"horizon\" disabled onSelect={handleDisabledSelect}>Horizon Risk Solutions\n </Command.Item>\n </Command.List>\n <Command.Empty>No results found.</Command.Empty>\n</Command.Root>;",
1931
+ "description": "A `disabled` row stays visible and searchable but cannot be chosen. cmdk skips it with the\narrow keys and swallows the click, and the row drops its hover and active styling so the\nlist does not invite the pointer."
1926
1932
  }
1927
1933
  ],
1928
1934
  "import": "import { Command } from \"@agentero/design-system\";"
@@ -4305,6 +4311,274 @@
4305
4311
  ],
4306
4312
  "import": "import { Avatar, Button, HoverCard } from \"@agentero/design-system\";"
4307
4313
  },
4314
+ "components-input": {
4315
+ "id": "components-input",
4316
+ "name": "Input",
4317
+ "path": "./src/input/input.stories.tsx",
4318
+ "jsDocTags": {
4319
+ "summary": [
4320
+ "Base single-line text control, unaware of fields and form libraries"
4321
+ ],
4322
+ "example": [
4323
+ "<Label htmlFor=\"email\">Email</Label>\n<Input id=\"email\" type=\"email\" placeholder=\"you@example.com\" />",
4324
+ "<Input id=\"email\" aria-invalid aria-describedby=\"email-error\" />\n<span id=\"email-error\">Enter a valid email address.</span>"
4325
+ ]
4326
+ },
4327
+ "description": "Input is the base single-line text control. It is intentionally unaware of\nform fields and form libraries: `id`, `aria-invalid` and `aria-describedby`\nare plain props, set by a field wrapper or by hand.\n\nThere is no `status` prop. Mark the control `aria-invalid` and the\ndestructive border follows, so the styling can never disagree with what\nassistive technology announces.",
4328
+ "summary": "Base single-line text control, unaware of fields and form libraries",
4329
+ "reactComponentMeta": {
4330
+ "displayName": "Input",
4331
+ "exportName": "Input",
4332
+ "filePath": "/home/runner/work/design-system/design-system/src/input/input.tsx",
4333
+ "description": "Input is the design system's base single-line text control. Reach for it\nwhenever a form collects free text, and pair it with\n[Label](?path=/docs/components-label--docs) so the control has an accessible\nname.\n\nIt is deliberately self-contained: it renders the props it is given and\nknows nothing about form fields, form libraries, or surrounding layout.\nWiring (`id`, `aria-invalid`, `aria-describedby`) arrives as plain props, so\na field wrapper can inject them and standalone usage can set them by hand.\nThere is no `status` prop — mark the control `aria-invalid` and the\ndestructive border follows.\n\nDo not use Input for multi-line text; that is TextArea's job. It also has no\nslots for leading or trailing addons — an input with a currency prefix or a\nunit suffix belongs in an input group, not here.",
4334
+ "jsDocTags": {
4335
+ "summary": [
4336
+ "Base single-line text control, unaware of fields and form libraries"
4337
+ ],
4338
+ "example": [
4339
+ "<Label htmlFor=\"email\">Email</Label>\n<Input id=\"email\" type=\"email\" placeholder=\"you@example.com\" />",
4340
+ "<Input id=\"email\" aria-invalid aria-describedby=\"email-error\" />\n<span id=\"email-error\">Enter a valid email address.</span>"
4341
+ ]
4342
+ },
4343
+ "props": {
4344
+ "aria-invalid": {
4345
+ "name": "aria-invalid",
4346
+ "required": false,
4347
+ "type": {
4348
+ "name": "boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\" | undefined"
4349
+ },
4350
+ "description": "Indicates the entered value does not conform to the format expected by the application.\nSet this when the value fails validation: it drives the destructive border\nand is what assistive technology announces. Point `aria-describedby` at\nthe error message so the two are read together.",
4351
+ "defaultValue": null,
4352
+ "parent": {
4353
+ "name": "AriaAttributes",
4354
+ "fileName": "node_modules/@types/react/index.d.ts"
4355
+ },
4356
+ "declarations": [
4357
+ {
4358
+ "name": "AriaAttributes",
4359
+ "fileName": "node_modules/@types/react/index.d.ts"
4360
+ },
4361
+ {
4362
+ "name": "TypeLiteral",
4363
+ "fileName": "src/input/input.tsx"
4364
+ }
4365
+ ]
4366
+ },
4367
+ "type": {
4368
+ "name": "type",
4369
+ "required": false,
4370
+ "type": {
4371
+ "name": "HTMLInputTypeAttribute | undefined"
4372
+ },
4373
+ "description": "Native input type. Picks the on-screen keyboard on touch devices and the\nbrowser's own parsing, so set it even when you validate yourself.\nDefaults to `'text'`. Multi-line text is not one of the options — that is\na TextArea.",
4374
+ "defaultValue": null,
4375
+ "parent": {
4376
+ "name": "InputHTMLAttributes",
4377
+ "fileName": "node_modules/@types/react/index.d.ts"
4378
+ },
4379
+ "declarations": [
4380
+ {
4381
+ "name": "InputHTMLAttributes",
4382
+ "fileName": "node_modules/@types/react/index.d.ts"
4383
+ },
4384
+ {
4385
+ "name": "TypeLiteral",
4386
+ "fileName": "src/input/input.tsx"
4387
+ }
4388
+ ]
4389
+ },
4390
+ "disabled": {
4391
+ "name": "disabled",
4392
+ "required": false,
4393
+ "type": {
4394
+ "name": "boolean"
4395
+ },
4396
+ "description": "Blocks interaction, greys the control out and drops its shadow. The value\nis not submitted. When the user still needs to read or copy the value,\nuse `readOnly` instead.",
4397
+ "defaultValue": null,
4398
+ "parent": {
4399
+ "name": "InputHTMLAttributes",
4400
+ "fileName": "node_modules/@types/react/index.d.ts"
4401
+ },
4402
+ "declarations": [
4403
+ {
4404
+ "name": "InputHTMLAttributes",
4405
+ "fileName": "node_modules/@types/react/index.d.ts"
4406
+ },
4407
+ {
4408
+ "name": "TypeLiteral",
4409
+ "fileName": "src/input/input.tsx"
4410
+ }
4411
+ ]
4412
+ },
4413
+ "placeholder": {
4414
+ "name": "placeholder",
4415
+ "required": false,
4416
+ "type": {
4417
+ "name": "string"
4418
+ },
4419
+ "description": "Short hint shown while the field is empty. It disappears on the first\nkeystroke, so it is never a substitute for a label.",
4420
+ "defaultValue": null,
4421
+ "parent": {
4422
+ "name": "InputHTMLAttributes",
4423
+ "fileName": "node_modules/@types/react/index.d.ts"
4424
+ },
4425
+ "declarations": [
4426
+ {
4427
+ "name": "InputHTMLAttributes",
4428
+ "fileName": "node_modules/@types/react/index.d.ts"
4429
+ },
4430
+ {
4431
+ "name": "TypeLiteral",
4432
+ "fileName": "src/input/input.tsx"
4433
+ }
4434
+ ]
4435
+ },
4436
+ "readOnly": {
4437
+ "name": "readOnly",
4438
+ "required": false,
4439
+ "type": {
4440
+ "name": "boolean"
4441
+ },
4442
+ "description": "Keeps the value focusable and copyable but not editable, and still\nsubmits it. Unlike `disabled`, it stays in the tab order.",
4443
+ "defaultValue": null,
4444
+ "parent": {
4445
+ "name": "InputHTMLAttributes",
4446
+ "fileName": "node_modules/@types/react/index.d.ts"
4447
+ },
4448
+ "declarations": [
4449
+ {
4450
+ "name": "InputHTMLAttributes",
4451
+ "fileName": "node_modules/@types/react/index.d.ts"
4452
+ },
4453
+ {
4454
+ "name": "TypeLiteral",
4455
+ "fileName": "src/input/input.tsx"
4456
+ }
4457
+ ]
4458
+ },
4459
+ "required": {
4460
+ "name": "required",
4461
+ "required": false,
4462
+ "type": {
4463
+ "name": "boolean"
4464
+ },
4465
+ "description": "Marks the control required for both the browser and assistive technology.",
4466
+ "defaultValue": null,
4467
+ "parent": {
4468
+ "name": "InputHTMLAttributes",
4469
+ "fileName": "node_modules/@types/react/index.d.ts"
4470
+ },
4471
+ "declarations": [
4472
+ {
4473
+ "name": "InputHTMLAttributes",
4474
+ "fileName": "node_modules/@types/react/index.d.ts"
4475
+ },
4476
+ {
4477
+ "name": "TypeLiteral",
4478
+ "fileName": "src/input/input.tsx"
4479
+ }
4480
+ ]
4481
+ },
4482
+ "size": {
4483
+ "name": "size",
4484
+ "required": false,
4485
+ "type": {
4486
+ "name": "enum",
4487
+ "raw": "\"sm\" | \"md\" | \"lg\"",
4488
+ "value": [
4489
+ {
4490
+ "value": "\"sm\""
4491
+ },
4492
+ {
4493
+ "value": "\"md\""
4494
+ },
4495
+ {
4496
+ "value": "\"lg\""
4497
+ }
4498
+ ]
4499
+ },
4500
+ "description": "Control height. Defaults to `'md'`.\n- `sm` (32px) — dense layouts where vertical space is tight.\n- `md` (40px) — standard form density.\n- `lg` (48px) — low-density forms and larger touch targets. Also raises\n the text to `base` and the corner radius to `lg`.",
4501
+ "defaultValue": null,
4502
+ "parent": {
4503
+ "name": "InputProps",
4504
+ "fileName": "src/input/input.tsx"
4505
+ },
4506
+ "declarations": [
4507
+ {
4508
+ "name": "TypeLiteral",
4509
+ "fileName": "src/input/input.tsx"
4510
+ }
4511
+ ]
4512
+ }
4513
+ }
4514
+ },
4515
+ "stories": [
4516
+ {
4517
+ "id": "components-input--default",
4518
+ "name": "Default",
4519
+ "snippet": "const Default = () => <Input type=\"text\" placeholder=\"Insert value\" aria-label=\"Value\" />;",
4520
+ "description": "The default control at `md`, usable anywhere without a surrounding field.",
4521
+ "summary": "Default standalone input"
4522
+ },
4523
+ {
4524
+ "id": "components-input--small",
4525
+ "name": "Small",
4526
+ "snippet": "const Small = () => <Input type=\"text\" placeholder=\"Insert value\" aria-label=\"Value\" size=\"sm\" />;",
4527
+ "description": "`sm` (32px) keeps dense layouts compact where vertical space is tight.",
4528
+ "summary": "Small 32px control for dense layouts"
4529
+ },
4530
+ {
4531
+ "id": "components-input--medium",
4532
+ "name": "Medium",
4533
+ "snippet": "const Medium = () => <Input type=\"text\" placeholder=\"Insert value\" aria-label=\"Value\" size=\"md\" />;",
4534
+ "description": "`md` (40px) is the default and covers standard form density.",
4535
+ "summary": "Medium 40px control, the default"
4536
+ },
4537
+ {
4538
+ "id": "components-input--large",
4539
+ "name": "Large",
4540
+ "snippet": "const Large = () => <Input type=\"text\" placeholder=\"Insert value\" aria-label=\"Value\" size=\"lg\" />;",
4541
+ "description": "`lg` (48px) suits low-density forms and larger touch targets. It also raises\nthe text to `base` and the corner radius to `lg`.",
4542
+ "summary": "Large 48px control for low-density forms"
4543
+ },
4544
+ {
4545
+ "id": "components-input--all-sizes",
4546
+ "name": "All Sizes",
4547
+ "snippet": "const AllSizes = () => <div style={{ display: 'grid', gap: '1rem', maxWidth: '20rem' }}>\n <Input type=\"text\" size=\"sm\" aria-label=\"Small input\" placeholder=\"sm — 32px\" />\n <Input type=\"text\" size=\"md\" aria-label=\"Medium input\" placeholder=\"md — 40px\" />\n <Input type=\"text\" size=\"lg\" aria-label=\"Large input\" placeholder=\"lg — 48px\" />\n</div>;",
4548
+ "description": "All three heights together for visual comparison.",
4549
+ "summary": "Visual comparison of the three input sizes"
4550
+ },
4551
+ {
4552
+ "id": "components-input--types",
4553
+ "name": "Types",
4554
+ "snippet": "const Types = () => <div style={{ display: 'grid', gap: '1rem', maxWidth: '20rem' }}>\n <Input type=\"text\" aria-label=\"Text\" placeholder=\"Text\" />\n <Input type=\"email\" aria-label=\"Email address\" placeholder=\"you@example.com\" />\n <Input type=\"password\" aria-label=\"Password\" placeholder=\"Password\" />\n <Input type=\"number\" aria-label=\"Amount\" placeholder=\"0\" />\n <Input type=\"date\" aria-label=\"Date\" placeholder=\"\" />\n</div>;",
4555
+ "description": "A range of input types. The type picks the on-screen keyboard on touch\ndevices and the browser's own parsing, so set it even when you validate\nyourself.",
4556
+ "summary": "Common input types side by side"
4557
+ },
4558
+ {
4559
+ "id": "components-input--invalid",
4560
+ "name": "Invalid",
4561
+ "snippet": "const Invalid = () => <div style={{ display: 'grid', gap: '0.25rem', maxWidth: '20rem' }}>\n <Input\n type=\"email\"\n placeholder=\"Insert value\"\n aria-label=\"Email\"\n aria-invalid\n aria-describedby=\"email-error\"\n defaultValue=\"not-an-email\" />\n <span id=\"email-error\">Enter a valid email address.</span>\n</div>;",
4562
+ "description": "The invalid treatment comes purely from `aria-invalid`, so the border can\nnever disagree with what assistive technology announces. Point\n`aria-describedby` at the message so it is read out with the control.",
4563
+ "summary": "Invalid state driven by aria-invalid"
4564
+ },
4565
+ {
4566
+ "id": "components-input--disabled",
4567
+ "name": "Disabled",
4568
+ "snippet": "const Disabled = () => <Input\n type=\"text\"\n placeholder=\"Insert value\"\n aria-label=\"Value\"\n disabled\n defaultValue=\"Cannot be edited\" />;",
4569
+ "description": "A disabled input keeps its value readable but blocks interaction, drops its\nshadow and leaves the tab order.",
4570
+ "summary": "Disabled state"
4571
+ },
4572
+ {
4573
+ "id": "components-input--read-only",
4574
+ "name": "Read Only",
4575
+ "snippet": "const ReadOnly = () => <Input\n type=\"text\"\n placeholder=\"Insert value\"\n aria-label=\"Value\"\n readOnly\n defaultValue=\"Copy me, but do not change me\" />;",
4576
+ "description": "Read-only inputs stay focusable and copyable and still submit their value —\nreach for this over `disabled` when the user needs to read or copy something\nthey cannot change.",
4577
+ "summary": "Read-only value that stays focusable and copyable"
4578
+ }
4579
+ ],
4580
+ "import": "import { Input } from \"@agentero/design-system\";"
4581
+ },
4308
4582
  "components-label": {
4309
4583
  "id": "components-label",
4310
4584
  "name": "Label",
@@ -7013,6 +7287,6 @@
7013
7287
  },
7014
7288
  "meta": {
7015
7289
  "docgen": "react-component-meta",
7016
- "durationMs": 3272
7290
+ "durationMs": 5599
7017
7291
  }
7018
7292
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentero/design-system",
3
- "version": "0.25.4",
3
+ "version": "0.26.1",
4
4
  "description": "A React component library built with Tailwind CSS v4 and Radix UI primitives",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -65,6 +65,10 @@
65
65
  "types": "./src/hover-card/index.d.ts",
66
66
  "import": "./src/hover-card/index.js"
67
67
  },
68
+ "./input": {
69
+ "types": "./src/input/index.d.ts",
70
+ "import": "./src/input/index.js"
71
+ },
68
72
  "./label": {
69
73
  "types": "./src/label/index.d.ts",
70
74
  "import": "./src/label/index.js"
@@ -220,7 +220,8 @@ export declare const Group: {
220
220
  * @property {string} [className] - Additional CSS classes to apply.
221
221
  *
222
222
  * @dataAttribute {string} data-selected - "true" on the active row, "false" otherwise
223
- * @dataAttribute {string} data-disabled - "true" when disabled, "false" otherwise
223
+ * @dataAttribute {string} data-disabled - "true" when disabled, "false" otherwise. A disabled row
224
+ * drops the hover and active backgrounds and renders in the disabled text color.
224
225
  */
225
226
  type ItemProps = ComponentProps<typeof CommandPrimitive.Item>;
226
227
  /**
@@ -14,7 +14,9 @@ var a = t({ slots: {
14
14
  item: [
15
15
  "flex items-center rounded-md px-3 py-2 text-sm text-text-default-base-primary",
16
16
  "cursor-pointer hover:bg-bg-default-base-tertiary",
17
- "data-[selected=true]:bg-bg-default-base-tertiary"
17
+ "data-[selected=true]:bg-bg-default-base-tertiary",
18
+ "data-[disabled=true]:cursor-default data-[disabled=true]:text-text-default-disable-primary",
19
+ "data-[disabled=true]:hover:bg-transparent data-[disabled=true]:data-[selected=true]:bg-transparent"
18
20
  ]
19
21
  } }), o = a(), s = ({ className: e, ...t }) => /* @__PURE__ */ n(i, {
20
22
  "data-slot": "command-root",
@@ -0,0 +1,2 @@
1
+ export { Input, inputRecipe } from './input';
2
+ export type { InputProps, InputSize, InputVariants } from './input';
@@ -0,0 +1,2 @@
1
+ import { Input as e, inputRecipe as t } from "./input.js";
2
+ export { e as Input, t as inputRecipe };
@@ -0,0 +1,109 @@
1
+ import { ComponentPropsWithRef } from 'react';
2
+ import { VariantProps } from 'tailwind-variants';
3
+ /**
4
+ * Style recipe for Input. Single-element recipe with a `size` variant; the
5
+ * invalid treatment is driven entirely by the `aria-invalid` attribute so the
6
+ * visual state can never drift from what assistive technology announces.
7
+ *
8
+ * @summary tailwind-variants recipe backing the Input component styles
9
+ */
10
+ export declare const inputRecipe: import('tailwind-variants').TVReturnType<{
11
+ size: {
12
+ sm: string;
13
+ md: string;
14
+ lg: string;
15
+ };
16
+ }, undefined, string[], {
17
+ size: {
18
+ sm: string;
19
+ md: string;
20
+ lg: string;
21
+ };
22
+ }, undefined, import('tailwind-variants').TVReturnType<{
23
+ size: {
24
+ sm: string;
25
+ md: string;
26
+ lg: string;
27
+ };
28
+ }, undefined, string[], unknown, unknown, undefined>>;
29
+ export type InputVariants = VariantProps<typeof inputRecipe>;
30
+ /** Control height. See the `size` prop for when to reach for each one. */
31
+ export type InputSize = NonNullable<InputVariants['size']>;
32
+ /**
33
+ * Every standard `<input>` attribute is accepted and forwarded. The handful
34
+ * redeclared below are the ones worth documenting: they are what most callers
35
+ * reach for, and `react-docgen` does not expand native attributes, so without
36
+ * this they would be invisible in the docs and the MCP manifest.
37
+ */
38
+ export type InputProps = Omit<ComponentPropsWithRef<'input'>, 'size'> & {
39
+ /**
40
+ * Control height. Defaults to `'md'`.
41
+ * - `sm` (32px) — dense layouts where vertical space is tight.
42
+ * - `md` (40px) — standard form density.
43
+ * - `lg` (48px) — low-density forms and larger touch targets. Also raises
44
+ * the text to `base` and the corner radius to `lg`.
45
+ */
46
+ size?: InputSize;
47
+ /**
48
+ * Native input type. Picks the on-screen keyboard on touch devices and the
49
+ * browser's own parsing, so set it even when you validate yourself.
50
+ * Defaults to `'text'`. Multi-line text is not one of the options — that is
51
+ * a TextArea.
52
+ */
53
+ type?: ComponentPropsWithRef<'input'>['type'];
54
+ /**
55
+ * Short hint shown while the field is empty. It disappears on the first
56
+ * keystroke, so it is never a substitute for a label.
57
+ */
58
+ placeholder?: string;
59
+ /**
60
+ * Blocks interaction, greys the control out and drops its shadow. The value
61
+ * is not submitted. When the user still needs to read or copy the value,
62
+ * use `readOnly` instead.
63
+ */
64
+ disabled?: boolean;
65
+ /**
66
+ * Keeps the value focusable and copyable but not editable, and still
67
+ * submits it. Unlike `disabled`, it stays in the tab order.
68
+ */
69
+ readOnly?: boolean;
70
+ /** Marks the control required for both the browser and assistive technology. */
71
+ required?: boolean;
72
+ /**
73
+ * Set this when the value fails validation: it drives the destructive border
74
+ * and is what assistive technology announces. Point `aria-describedby` at
75
+ * the error message so the two are read together.
76
+ */
77
+ 'aria-invalid'?: ComponentPropsWithRef<'input'>['aria-invalid'];
78
+ };
79
+ /**
80
+ * Input is the design system's base single-line text control. Reach for it
81
+ * whenever a form collects free text, and pair it with
82
+ * [Label](?path=/docs/components-label--docs) so the control has an accessible
83
+ * name.
84
+ *
85
+ * It is deliberately self-contained: it renders the props it is given and
86
+ * knows nothing about form fields, form libraries, or surrounding layout.
87
+ * Wiring (`id`, `aria-invalid`, `aria-describedby`) arrives as plain props, so
88
+ * a field wrapper can inject them and standalone usage can set them by hand.
89
+ * There is no `status` prop — mark the control `aria-invalid` and the
90
+ * destructive border follows.
91
+ *
92
+ * Do not use Input for multi-line text; that is TextArea's job. It also has no
93
+ * slots for leading or trailing addons — an input with a currency prefix or a
94
+ * unit suffix belongs in an input group, not here.
95
+ *
96
+ * @summary Base single-line text control, unaware of fields and form libraries
97
+ *
98
+ * @example
99
+ * <Label htmlFor="email">Email</Label>
100
+ * <Input id="email" type="email" placeholder="you@example.com" />
101
+ *
102
+ * @example
103
+ * <Input id="email" aria-invalid aria-describedby="email-error" />
104
+ * <span id="email-error">Enter a valid email address.</span>
105
+ */
106
+ export declare const Input: {
107
+ ({ className, size, ...props }: InputProps): import("react/jsx-runtime").JSX.Element;
108
+ displayName: string;
109
+ };
@@ -0,0 +1,35 @@
1
+ import { cn as e } from "../../lib/utils.js";
2
+ import { tv as t } from "tailwind-variants";
3
+ import { jsx as n } from "react/jsx-runtime";
4
+ //#region src/input/input.tsx
5
+ var r = t({
6
+ base: [
7
+ "box-border w-full min-w-0 appearance-none rounded-md px-4 shadow-sm",
8
+ "border border-solid border-border-input-default bg-bg-input-normal text-text-input-normal",
9
+ "placeholder:text-text-input-placeholder placeholder-shown:text-ellipsis",
10
+ "outline-0 -outline-offset-1 outline-[transparent]",
11
+ "transition-[color,box-shadow,outline-color,outline-offset,outline-width] duration-75",
12
+ "focus-visible:border-border-input-focus focus-visible:outline-border-input-focus",
13
+ "focus-visible:outline-[0.125rem] focus-visible:outline-offset-[-0.0625rem]",
14
+ "aria-invalid:border-border-input-destructive",
15
+ "aria-invalid:focus-visible:border-border-input-destructive",
16
+ "aria-invalid:focus-visible:outline-border-input-destructive",
17
+ "disabled:cursor-default disabled:border-border-input-disable disabled:bg-bg-input-disable",
18
+ "disabled:text-text-input-disable disabled:shadow-none",
19
+ "disabled:placeholder:text-text-input-disable"
20
+ ],
21
+ variants: { size: {
22
+ sm: "h-8 text-sm",
23
+ md: "h-10 text-sm",
24
+ lg: "h-12 rounded-lg text-base"
25
+ } },
26
+ defaultVariants: { size: "md" }
27
+ }), i = ({ className: t, size: i, ...a }) => /* @__PURE__ */ n("input", {
28
+ "data-slot": "input",
29
+ "data-size": i,
30
+ className: e(r({ size: i }), t),
31
+ ...a
32
+ });
33
+ i.displayName = "Input";
34
+ //#endregion
35
+ export { i as Input, r as inputRecipe };