@agentero/design-system 0.25.4 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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">203 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>4.0s</strong>.
598
598
  </div>
599
599
  <h2 class="section-title">Components</h2>
600
600
  <div class="grid" role="list">
@@ -4504,6 +4504,245 @@ trigger-dense UIs where an instant preview reads as more responsive.</div>
4504
4504
  </div>
4505
4505
 
4506
4506
 
4507
+ </div>
4508
+ </article>
4509
+ <article
4510
+ class="card
4511
+ no-error
4512
+ no-info
4513
+ no-story-error
4514
+ no-doc-error"
4515
+ role="listitem"
4516
+ aria-label="Input">
4517
+ <div class="head">
4518
+ <div class="title">
4519
+ <h2><span class="status-dot dot-ok"></span> Input</h2>
4520
+ <div class="badges">
4521
+ <label for="c-11-components-input-props" class="badge ok as-toggle">7 prop types</label>
4522
+
4523
+ <label for="c-11-components-input-stories" class="badge ok as-toggle">9 stories</label>
4524
+
4525
+
4526
+ </div>
4527
+ </div>
4528
+ <div class="meta" title="./src/input/input.stories.tsx">components-input · ./src/input/input.stories.tsx</div>
4529
+ <div>Base single-line text control, unaware of fields and form libraries</div>
4530
+ <div class="hint">Input is the base single-line text control. It is intentionally unaware of
4531
+ form fields and form libraries: `id`, `aria-invalid` and `aria-describedby`
4532
+ are plain props, set by a field wrapper or by hand.
4533
+
4534
+ There is no `status` prop. Mark the control `aria-invalid` and the
4535
+ destructive border follows, so the styling can never disagree with what
4536
+ assistive technology announces.</div>
4537
+ <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;
4538
+ &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;
4539
+ &lt;span id=&quot;email-error&quot;&gt;Enter a valid email address.&lt;/span&gt;</span></div>
4540
+ </div>
4541
+
4542
+ <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
4543
+
4544
+
4545
+ <input id="c-11-components-input-stories" class="tg tg-stories" type="checkbox" hidden />
4546
+
4547
+
4548
+ <input id="c-11-components-input-props" class="tg tg-props" type="checkbox" hidden />
4549
+
4550
+ <div class="panels">
4551
+
4552
+
4553
+
4554
+ <div class="panel panel-props">
4555
+ <div class="note ok">
4556
+ <div class="row">
4557
+ <span class="ex-name">Prop types <small>(react-component-meta)</small></span>
4558
+ <span class="badge ok">7 prop types</span>
4559
+ </div>
4560
+ <pre><code>Component: src/input/input.tsx::Input</code></pre>
4561
+ <pre><code>Props:</code></pre>
4562
+ <pre><code>/**
4563
+ * Indicates the entered value does not conform to the format expected by the application.
4564
+ * Set this when the value fails validation: it drives the destructive border
4565
+ * and is what assistive technology announces. Point `aria-describedby` at
4566
+ * the error message so the two are read together.
4567
+ */
4568
+ aria-invalid?: boolean | &quot;true&quot; | &quot;false&quot; | &quot;grammar&quot; | &quot;spelling&quot; | undefined
4569
+
4570
+ /**
4571
+ * Blocks interaction, greys the control out and drops its shadow. The value
4572
+ * is not submitted. When the user still needs to read or copy the value,
4573
+ * use `readOnly` instead.
4574
+ */
4575
+ disabled?: boolean
4576
+
4577
+ /**
4578
+ * Short hint shown while the field is empty. It disappears on the first
4579
+ * keystroke, so it is never a substitute for a label.
4580
+ */
4581
+ placeholder?: string
4582
+
4583
+ /**
4584
+ * Keeps the value focusable and copyable but not editable, and still
4585
+ * submits it. Unlike `disabled`, it stays in the tab order.
4586
+ */
4587
+ readOnly?: boolean
4588
+
4589
+ /**
4590
+ * Marks the control required for both the browser and assistive technology.
4591
+ */
4592
+ required?: boolean
4593
+
4594
+ /**
4595
+ * Control height. Defaults to `&#39;md&#39;`.
4596
+ * - `sm` (32px) — dense layouts where vertical space is tight.
4597
+ * - `md` (40px) — standard form density.
4598
+ * - `lg` (48px) — low-density forms and larger touch targets. Also raises
4599
+ * the text to `base` and the corner radius to `lg`.
4600
+ */
4601
+ size?: &quot;sm&quot; | &quot;md&quot; | &quot;lg&quot;
4602
+
4603
+ /**
4604
+ * Native input type. Picks the on-screen keyboard on touch devices and the
4605
+ * browser&#39;s own parsing, so set it even when you validate yourself.
4606
+ * Defaults to `&#39;text&#39;`. Multi-line text is not one of the options — that is
4607
+ * a TextArea.
4608
+ */
4609
+ type?: HTMLInputTypeAttribute | undefined</code></pre>
4610
+ </div>
4611
+ </div>
4612
+
4613
+ <div class="panel panel-stories">
4614
+
4615
+
4616
+
4617
+ <div class="note ok">
4618
+ <div class="row">
4619
+ <span class="ex-name">Imports</span>
4620
+ </div>
4621
+ <pre><code>import { Input } from "@agentero/design-system";</code></pre>
4622
+ </div>
4623
+
4624
+
4625
+ <div class="note ok">
4626
+ <div class="row">
4627
+ <span class="ex-name">Default</span>
4628
+ <span class="badge ok">story ok</span>
4629
+ </div>
4630
+ <div>Default standalone input</div>
4631
+ <div class="hint">The default control at `md`, usable anywhere without a surrounding field.</div>
4632
+ <pre><code>const Default = () =&gt; &lt;Input type=&quot;text&quot; placeholder=&quot;Insert value&quot; aria-label=&quot;Value&quot; /&gt;;</code></pre>
4633
+ </div>
4634
+ <div class="note ok">
4635
+ <div class="row">
4636
+ <span class="ex-name">Small</span>
4637
+ <span class="badge ok">story ok</span>
4638
+ </div>
4639
+ <div>Small 32px control for dense layouts</div>
4640
+ <div class="hint">`sm` (32px) keeps dense layouts compact where vertical space is tight.</div>
4641
+ <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>
4642
+ </div>
4643
+ <div class="note ok">
4644
+ <div class="row">
4645
+ <span class="ex-name">Medium</span>
4646
+ <span class="badge ok">story ok</span>
4647
+ </div>
4648
+ <div>Medium 40px control, the default</div>
4649
+ <div class="hint">`md` (40px) is the default and covers standard form density.</div>
4650
+ <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>
4651
+ </div>
4652
+ <div class="note ok">
4653
+ <div class="row">
4654
+ <span class="ex-name">Large</span>
4655
+ <span class="badge ok">story ok</span>
4656
+ </div>
4657
+ <div>Large 48px control for low-density forms</div>
4658
+ <div class="hint">`lg` (48px) suits low-density forms and larger touch targets. It also raises
4659
+ the text to `base` and the corner radius to `lg`.</div>
4660
+ <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>
4661
+ </div>
4662
+ <div class="note ok">
4663
+ <div class="row">
4664
+ <span class="ex-name">All Sizes</span>
4665
+ <span class="badge ok">story ok</span>
4666
+ </div>
4667
+ <div>Visual comparison of the three input sizes</div>
4668
+ <div class="hint">All three heights together for visual comparison.</div>
4669
+ <pre><code>const AllSizes = () =&gt; &lt;div style={{ display: &#39;grid&#39;, gap: &#39;1rem&#39;, maxWidth: &#39;20rem&#39; }}&gt;
4670
+ &lt;Input type=&quot;text&quot; size=&quot;sm&quot; aria-label=&quot;Small input&quot; placeholder=&quot;sm — 32px&quot; /&gt;
4671
+ &lt;Input type=&quot;text&quot; size=&quot;md&quot; aria-label=&quot;Medium input&quot; placeholder=&quot;md — 40px&quot; /&gt;
4672
+ &lt;Input type=&quot;text&quot; size=&quot;lg&quot; aria-label=&quot;Large input&quot; placeholder=&quot;lg — 48px&quot; /&gt;
4673
+ &lt;/div&gt;;</code></pre>
4674
+ </div>
4675
+ <div class="note ok">
4676
+ <div class="row">
4677
+ <span class="ex-name">Types</span>
4678
+ <span class="badge ok">story ok</span>
4679
+ </div>
4680
+ <div>Common input types side by side</div>
4681
+ <div class="hint">A range of input types. The type picks the on-screen keyboard on touch
4682
+ devices and the browser&#39;s own parsing, so set it even when you validate
4683
+ yourself.</div>
4684
+ <pre><code>const Types = () =&gt; &lt;div style={{ display: &#39;grid&#39;, gap: &#39;1rem&#39;, maxWidth: &#39;20rem&#39; }}&gt;
4685
+ &lt;Input type=&quot;text&quot; aria-label=&quot;Text&quot; placeholder=&quot;Text&quot; /&gt;
4686
+ &lt;Input type=&quot;email&quot; aria-label=&quot;Email address&quot; placeholder=&quot;you@example.com&quot; /&gt;
4687
+ &lt;Input type=&quot;password&quot; aria-label=&quot;Password&quot; placeholder=&quot;Password&quot; /&gt;
4688
+ &lt;Input type=&quot;number&quot; aria-label=&quot;Amount&quot; placeholder=&quot;0&quot; /&gt;
4689
+ &lt;Input type=&quot;date&quot; aria-label=&quot;Date&quot; placeholder=&quot;&quot; /&gt;
4690
+ &lt;/div&gt;;</code></pre>
4691
+ </div>
4692
+ <div class="note ok">
4693
+ <div class="row">
4694
+ <span class="ex-name">Invalid</span>
4695
+ <span class="badge ok">story ok</span>
4696
+ </div>
4697
+ <div>Invalid state driven by aria-invalid</div>
4698
+ <div class="hint">The invalid treatment comes purely from `aria-invalid`, so the border can
4699
+ never disagree with what assistive technology announces. Point
4700
+ `aria-describedby` at the message so it is read out with the control.</div>
4701
+ <pre><code>const Invalid = () =&gt; &lt;div style={{ display: &#39;grid&#39;, gap: &#39;0.25rem&#39;, maxWidth: &#39;20rem&#39; }}&gt;
4702
+ &lt;Input
4703
+ type=&quot;email&quot;
4704
+ placeholder=&quot;Insert value&quot;
4705
+ aria-label=&quot;Email&quot;
4706
+ aria-invalid
4707
+ aria-describedby=&quot;email-error&quot;
4708
+ defaultValue=&quot;not-an-email&quot; /&gt;
4709
+ &lt;span id=&quot;email-error&quot;&gt;Enter a valid email address.&lt;/span&gt;
4710
+ &lt;/div&gt;;</code></pre>
4711
+ </div>
4712
+ <div class="note ok">
4713
+ <div class="row">
4714
+ <span class="ex-name">Disabled</span>
4715
+ <span class="badge ok">story ok</span>
4716
+ </div>
4717
+ <div>Disabled state</div>
4718
+ <div class="hint">A disabled input keeps its value readable but blocks interaction, drops its
4719
+ shadow and leaves the tab order.</div>
4720
+ <pre><code>const Disabled = () =&gt; &lt;Input
4721
+ type=&quot;text&quot;
4722
+ placeholder=&quot;Insert value&quot;
4723
+ aria-label=&quot;Value&quot;
4724
+ disabled
4725
+ defaultValue=&quot;Cannot be edited&quot; /&gt;;</code></pre>
4726
+ </div>
4727
+ <div class="note ok">
4728
+ <div class="row">
4729
+ <span class="ex-name">Read Only</span>
4730
+ <span class="badge ok">story ok</span>
4731
+ </div>
4732
+ <div>Read-only value that stays focusable and copyable</div>
4733
+ <div class="hint">Read-only inputs stay focusable and copyable and still submit their value —
4734
+ reach for this over `disabled` when the user needs to read or copy something
4735
+ they cannot change.</div>
4736
+ <pre><code>const ReadOnly = () =&gt; &lt;Input
4737
+ type=&quot;text&quot;
4738
+ placeholder=&quot;Insert value&quot;
4739
+ aria-label=&quot;Value&quot;
4740
+ readOnly
4741
+ defaultValue=&quot;Copy me, but do not change me&quot; /&gt;;</code></pre>
4742
+ </div>
4743
+ </div>
4744
+
4745
+
4507
4746
  </div>
4508
4747
  </article>
4509
4748
  <article
@@ -4518,9 +4757,9 @@ trigger-dense UIs where an instant preview reads as more responsive.</div>
4518
4757
  <div class="title">
4519
4758
  <h2><span class="status-dot dot-ok"></span> Label</h2>
4520
4759
  <div class="badges">
4521
- <label for="c-11-components-label-props" class="badge ok as-toggle">3 prop types</label>
4760
+ <label for="c-12-components-label-props" class="badge ok as-toggle">3 prop types</label>
4522
4761
 
4523
- <label for="c-11-components-label-stories" class="badge ok as-toggle">4 stories</label>
4762
+ <label for="c-12-components-label-stories" class="badge ok as-toggle">4 stories</label>
4524
4763
 
4525
4764
 
4526
4765
  </div>
@@ -4540,10 +4779,10 @@ still has to carry `required` / `aria-required`.</div>
4540
4779
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
4541
4780
 
4542
4781
 
4543
- <input id="c-11-components-label-stories" class="tg tg-stories" type="checkbox" hidden />
4782
+ <input id="c-12-components-label-stories" class="tg tg-stories" type="checkbox" hidden />
4544
4783
 
4545
4784
 
4546
- <input id="c-11-components-label-props" class="tg tg-props" type="checkbox" hidden />
4785
+ <input id="c-12-components-label-props" class="tg tg-props" type="checkbox" hidden />
4547
4786
 
4548
4787
  <div class="panels">
4549
4788
 
@@ -4641,9 +4880,9 @@ dropped, so a mistake never takes the page down.</div>
4641
4880
  <div class="title">
4642
4881
  <h2><span class="status-dot dot-ok"></span> Loading</h2>
4643
4882
  <div class="badges">
4644
- <label for="c-12-components-loading-props" class="badge ok as-toggle">1 prop type</label>
4883
+ <label for="c-13-components-loading-props" class="badge ok as-toggle">1 prop type</label>
4645
4884
 
4646
- <label for="c-12-components-loading-stories" class="badge ok as-toggle">7 stories</label>
4885
+ <label for="c-13-components-loading-stories" class="badge ok as-toggle">7 stories</label>
4647
4886
 
4648
4887
 
4649
4888
  </div>
@@ -4660,10 +4899,10 @@ parent font size via `em`-based size variants (`sm`, `md`, `lg`).</div>
4660
4899
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
4661
4900
 
4662
4901
 
4663
- <input id="c-12-components-loading-stories" class="tg tg-stories" type="checkbox" hidden />
4902
+ <input id="c-13-components-loading-stories" class="tg tg-stories" type="checkbox" hidden />
4664
4903
 
4665
4904
 
4666
- <input id="c-12-components-loading-props" class="tg tg-props" type="checkbox" hidden />
4905
+ <input id="c-13-components-loading-props" class="tg tg-props" type="checkbox" hidden />
4667
4906
 
4668
4907
  <div class="panels">
4669
4908
 
@@ -4814,9 +5053,9 @@ against the dark background.</div>
4814
5053
  <div class="title">
4815
5054
  <h2><span class="status-dot dot-ok"></span> Modal.Root</h2>
4816
5055
  <div class="badges">
4817
- <label for="c-13-components-modal-props" class="badge ok as-toggle">5 prop types</label>
5056
+ <label for="c-14-components-modal-props" class="badge ok as-toggle">5 prop types</label>
4818
5057
 
4819
- <label for="c-13-components-modal-stories" class="badge ok as-toggle">6 stories</label>
5058
+ <label for="c-14-components-modal-stories" class="badge ok as-toggle">6 stories</label>
4820
5059
 
4821
5060
 
4822
5061
  </div>
@@ -4862,10 +5101,10 @@ import { Modal } from &#39;@agentero/design-system/modal&#39;;
4862
5101
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
4863
5102
 
4864
5103
 
4865
- <input id="c-13-components-modal-stories" class="tg tg-stories" type="checkbox" hidden />
5104
+ <input id="c-14-components-modal-stories" class="tg tg-stories" type="checkbox" hidden />
4866
5105
 
4867
5106
 
4868
- <input id="c-13-components-modal-props" class="tg tg-props" type="checkbox" hidden />
5107
+ <input id="c-14-components-modal-props" class="tg tg-props" type="checkbox" hidden />
4869
5108
 
4870
5109
  <div class="panels">
4871
5110
 
@@ -5062,9 +5301,9 @@ announced as an `alertdialog`. Only the footer actions close it.</div>
5062
5301
  <div class="title">
5063
5302
  <h2><span class="status-dot dot-ok"></span> Pagination</h2>
5064
5303
  <div class="badges">
5065
- <label for="c-14-components-pagination-props" class="badge ok as-toggle">5 prop types</label>
5304
+ <label for="c-15-components-pagination-props" class="badge ok as-toggle">5 prop types</label>
5066
5305
 
5067
- <label for="c-14-components-pagination-stories" class="badge ok as-toggle">7 stories</label>
5306
+ <label for="c-15-components-pagination-stories" class="badge ok as-toggle">7 stories</label>
5068
5307
 
5069
5308
 
5070
5309
  </div>
@@ -5094,10 +5333,10 @@ const [page, setPage] = useState(1);
5094
5333
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
5095
5334
 
5096
5335
 
5097
- <input id="c-14-components-pagination-stories" class="tg tg-stories" type="checkbox" hidden />
5336
+ <input id="c-15-components-pagination-stories" class="tg tg-stories" type="checkbox" hidden />
5098
5337
 
5099
5338
 
5100
- <input id="c-14-components-pagination-props" class="tg tg-props" type="checkbox" hidden />
5339
+ <input id="c-15-components-pagination-props" class="tg tg-props" type="checkbox" hidden />
5101
5340
 
5102
5341
  <div class="panels">
5103
5342
 
@@ -5252,9 +5491,9 @@ entries summary follow along.</div>
5252
5491
  <div class="title">
5253
5492
  <h2><span class="status-dot dot-ok"></span> Popover.Root</h2>
5254
5493
  <div class="badges">
5255
- <label for="c-15-components-popover-props" class="badge ok as-toggle">5 prop types</label>
5494
+ <label for="c-16-components-popover-props" class="badge ok as-toggle">5 prop types</label>
5256
5495
 
5257
- <label for="c-15-components-popover-stories" class="badge ok as-toggle">4 stories</label>
5496
+ <label for="c-16-components-popover-stories" class="badge ok as-toggle">4 stories</label>
5258
5497
 
5259
5498
 
5260
5499
  </div>
@@ -5283,10 +5522,10 @@ import { Popover } from &#39;@agentero/design-system/popover&#39;;
5283
5522
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
5284
5523
 
5285
5524
 
5286
- <input id="c-15-components-popover-stories" class="tg tg-stories" type="checkbox" hidden />
5525
+ <input id="c-16-components-popover-stories" class="tg tg-stories" type="checkbox" hidden />
5287
5526
 
5288
5527
 
5289
- <input id="c-15-components-popover-props" class="tg tg-props" type="checkbox" hidden />
5528
+ <input id="c-16-components-popover-props" class="tg tg-props" type="checkbox" hidden />
5290
5529
 
5291
5530
  <div class="panels">
5292
5531
 
@@ -5441,9 +5680,9 @@ useful when the visual anchor differs from the toggle button.</div>
5441
5680
  <div class="title">
5442
5681
  <h2><span class="status-dot dot-ok"></span> Progress</h2>
5443
5682
  <div class="badges">
5444
- <label for="c-16-components-progress-props" class="badge ok as-toggle">4 prop types</label>
5683
+ <label for="c-17-components-progress-props" class="badge ok as-toggle">4 prop types</label>
5445
5684
 
5446
- <label for="c-16-components-progress-stories" class="badge ok as-toggle">4 stories</label>
5685
+ <label for="c-17-components-progress-stories" class="badge ok as-toggle">4 stories</label>
5447
5686
 
5448
5687
 
5449
5688
  </div>
@@ -5462,10 +5701,10 @@ with `currentColor`, so recolor it with a plain text class — e.g.
5462
5701
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
5463
5702
 
5464
5703
 
5465
- <input id="c-16-components-progress-stories" class="tg tg-stories" type="checkbox" hidden />
5704
+ <input id="c-17-components-progress-stories" class="tg tg-stories" type="checkbox" hidden />
5466
5705
 
5467
5706
 
5468
- <input id="c-16-components-progress-props" class="tg tg-props" type="checkbox" hidden />
5707
+ <input id="c-17-components-progress-props" class="tg tg-props" type="checkbox" hidden />
5469
5708
 
5470
5709
  <div class="panels">
5471
5710
 
@@ -5584,7 +5823,7 @@ percentage: number</code></pre>
5584
5823
  <div class="badges">
5585
5824
 
5586
5825
 
5587
- <label for="c-17-components-skeleton-stories" class="badge ok as-toggle">4 stories</label>
5826
+ <label for="c-18-components-skeleton-stories" class="badge ok as-toggle">4 stories</label>
5588
5827
 
5589
5828
 
5590
5829
  </div>
@@ -5601,7 +5840,7 @@ shape it with Tailwind classes to mirror the content it stands in for.</div>
5601
5840
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
5602
5841
 
5603
5842
 
5604
- <input id="c-17-components-skeleton-stories" class="tg tg-stories" type="checkbox" hidden />
5843
+ <input id="c-18-components-skeleton-stories" class="tg tg-stories" type="checkbox" hidden />
5605
5844
 
5606
5845
 
5607
5846
 
@@ -5697,9 +5936,9 @@ shape it with Tailwind classes to mirror the content it stands in for.</div>
5697
5936
  <div class="title">
5698
5937
  <h2><span class="status-dot dot-ok"></span> Switch</h2>
5699
5938
  <div class="badges">
5700
- <label for="c-18-components-switch-props" class="badge ok as-toggle">8 prop types</label>
5939
+ <label for="c-19-components-switch-props" class="badge ok as-toggle">8 prop types</label>
5701
5940
 
5702
- <label for="c-18-components-switch-stories" class="badge ok as-toggle">7 stories</label>
5941
+ <label for="c-19-components-switch-stories" class="badge ok as-toggle">7 stories</label>
5703
5942
 
5704
5943
 
5705
5944
  </div>
@@ -5715,10 +5954,10 @@ a Checkbox for a single boolean that applies instantly, and pair it with a
5715
5954
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
5716
5955
 
5717
5956
 
5718
- <input id="c-18-components-switch-stories" class="tg tg-stories" type="checkbox" hidden />
5957
+ <input id="c-19-components-switch-stories" class="tg tg-stories" type="checkbox" hidden />
5719
5958
 
5720
5959
 
5721
- <input id="c-18-components-switch-props" class="tg tg-props" type="checkbox" hidden />
5960
+ <input id="c-19-components-switch-props" class="tg tg-props" type="checkbox" hidden />
5722
5961
 
5723
5962
  <div class="panels">
5724
5963
 
@@ -5899,9 +6138,9 @@ size?: &quot;sm&quot; | &quot;md&quot;</code></pre>
5899
6138
  <div class="title">
5900
6139
  <h2><span class="status-dot dot-ok"></span> Table.Root</h2>
5901
6140
  <div class="badges">
5902
- <label for="c-19-components-table-props" class="badge ok as-toggle">6 prop types</label>
6141
+ <label for="c-20-components-table-props" class="badge ok as-toggle">6 prop types</label>
5903
6142
 
5904
- <label for="c-19-components-table-stories" class="badge ok as-toggle">9 stories</label>
6143
+ <label for="c-20-components-table-stories" class="badge ok as-toggle">9 stories</label>
5905
6144
 
5906
6145
 
5907
6146
  </div>
@@ -5932,10 +6171,10 @@ import { Table } from &#39;@agentero/design-system/table&#39;;
5932
6171
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
5933
6172
 
5934
6173
 
5935
- <input id="c-19-components-table-stories" class="tg tg-stories" type="checkbox" hidden />
6174
+ <input id="c-20-components-table-stories" class="tg tg-stories" type="checkbox" hidden />
5936
6175
 
5937
6176
 
5938
- <input id="c-19-components-table-props" class="tg tg-props" type="checkbox" hidden />
6177
+ <input id="c-20-components-table-props" class="tg tg-props" type="checkbox" hidden />
5939
6178
 
5940
6179
  <div class="panels">
5941
6180
 
@@ -6130,9 +6369,9 @@ import { Fragment } from "react";</code></pre>
6130
6369
  <div class="title">
6131
6370
  <h2><span class="status-dot dot-ok"></span> Tabs.Root</h2>
6132
6371
  <div class="badges">
6133
- <label for="c-20-components-tabs-props" class="badge ok as-toggle">9 prop types</label>
6372
+ <label for="c-21-components-tabs-props" class="badge ok as-toggle">9 prop types</label>
6134
6373
 
6135
- <label for="c-20-components-tabs-stories" class="badge ok as-toggle">8 stories</label>
6374
+ <label for="c-21-components-tabs-stories" class="badge ok as-toggle">8 stories</label>
6136
6375
 
6137
6376
 
6138
6377
  </div>
@@ -6163,10 +6402,10 @@ import { Tabs } from &#39;@agentero/design-system/tabs&#39;;
6163
6402
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
6164
6403
 
6165
6404
 
6166
- <input id="c-20-components-tabs-stories" class="tg tg-stories" type="checkbox" hidden />
6405
+ <input id="c-21-components-tabs-stories" class="tg tg-stories" type="checkbox" hidden />
6167
6406
 
6168
6407
 
6169
- <input id="c-20-components-tabs-props" class="tg tg-props" type="checkbox" hidden />
6408
+ <input id="c-21-components-tabs-props" class="tg tg-props" type="checkbox" hidden />
6170
6409
 
6171
6410
  <div class="panels">
6172
6411
 
@@ -6387,9 +6626,9 @@ tablist role is announced.</div>
6387
6626
  <div class="title">
6388
6627
  <h2><span class="status-dot dot-ok"></span> Tag</h2>
6389
6628
  <div class="badges">
6390
- <label for="c-21-components-tag-props" class="badge ok as-toggle">8 prop types</label>
6629
+ <label for="c-22-components-tag-props" class="badge ok as-toggle">8 prop types</label>
6391
6630
 
6392
- <label for="c-21-components-tag-stories" class="badge ok as-toggle">12 stories</label>
6631
+ <label for="c-22-components-tag-stories" class="badge ok as-toggle">12 stories</label>
6393
6632
 
6394
6633
 
6395
6634
  </div>
@@ -6408,10 +6647,10 @@ it an interactive link or button, which adds the pointer cursor and hover fill.<
6408
6647
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
6409
6648
 
6410
6649
 
6411
- <input id="c-21-components-tag-stories" class="tg tg-stories" type="checkbox" hidden />
6650
+ <input id="c-22-components-tag-stories" class="tg tg-stories" type="checkbox" hidden />
6412
6651
 
6413
6652
 
6414
- <input id="c-21-components-tag-props" class="tg tg-props" type="checkbox" hidden />
6653
+ <input id="c-22-components-tag-props" class="tg tg-props" type="checkbox" hidden />
6415
6654
 
6416
6655
  <div class="panels">
6417
6656
 
@@ -6836,9 +7075,9 @@ leading + trailing icons, and icon-only.</div>
6836
7075
  <div class="title">
6837
7076
  <h2><span class="status-dot dot-ok"></span> Toast</h2>
6838
7077
  <div class="badges">
6839
- <label for="c-22-components-toast-props" class="badge ok as-toggle">11 prop types</label>
7078
+ <label for="c-23-components-toast-props" class="badge ok as-toggle">11 prop types</label>
6840
7079
 
6841
- <label for="c-22-components-toast-stories" class="badge ok as-toggle">11 stories</label>
7080
+ <label for="c-23-components-toast-stories" class="badge ok as-toggle">11 stories</label>
6842
7081
 
6843
7082
 
6844
7083
  </div>
@@ -6857,10 +7096,10 @@ common feedback patterns.</div>
6857
7096
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
6858
7097
 
6859
7098
 
6860
- <input id="c-22-components-toast-stories" class="tg tg-stories" type="checkbox" hidden />
7099
+ <input id="c-23-components-toast-stories" class="tg tg-stories" type="checkbox" hidden />
6861
7100
 
6862
7101
 
6863
- <input id="c-22-components-toast-props" class="tg tg-props" type="checkbox" hidden />
7102
+ <input id="c-23-components-toast-props" class="tg tg-props" type="checkbox" hidden />
6864
7103
 
6865
7104
  <div class="panels">
6866
7105
 
@@ -7289,9 +7528,9 @@ action (e.g., a sync icon for a sync-in-progress toast).</div>
7289
7528
  <div class="title">
7290
7529
  <h2><span class="status-dot dot-ok"></span> Tooltip</h2>
7291
7530
  <div class="badges">
7292
- <label for="c-23-components-tooltip-props" class="badge ok as-toggle">12 prop types</label>
7531
+ <label for="c-24-components-tooltip-props" class="badge ok as-toggle">12 prop types</label>
7293
7532
 
7294
- <label for="c-23-components-tooltip-stories" class="badge ok as-toggle">5 stories</label>
7533
+ <label for="c-24-components-tooltip-stories" class="badge ok as-toggle">5 stories</label>
7295
7534
 
7296
7535
 
7297
7536
  </div>
@@ -7310,10 +7549,10 @@ on hover or focus.</div>
7310
7549
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
7311
7550
 
7312
7551
 
7313
- <input id="c-23-components-tooltip-stories" class="tg tg-stories" type="checkbox" hidden />
7552
+ <input id="c-24-components-tooltip-stories" class="tg tg-stories" type="checkbox" hidden />
7314
7553
 
7315
7554
 
7316
- <input id="c-23-components-tooltip-props" class="tg tg-props" type="checkbox" hidden />
7555
+ <input id="c-24-components-tooltip-props" class="tg tg-props" type="checkbox" hidden />
7317
7556
 
7318
7557
  <div class="panels">
7319
7558
 
@@ -7485,9 +7724,9 @@ sideOffset?: number = 4</code></pre>
7485
7724
  <div class="title">
7486
7725
  <h2><span class="status-dot dot-ok"></span> ValidationList</h2>
7487
7726
  <div class="badges">
7488
- <label for="c-24-components-validationlist-props" class="badge ok as-toggle">2 prop types</label>
7727
+ <label for="c-25-components-validationlist-props" class="badge ok as-toggle">2 prop types</label>
7489
7728
 
7490
- <label for="c-24-components-validationlist-stories" class="badge ok as-toggle">4 stories</label>
7729
+ <label for="c-25-components-validationlist-stories" class="badge ok as-toggle">4 stories</label>
7491
7730
 
7492
7731
 
7493
7732
  </div>
@@ -7508,10 +7747,10 @@ your form validation; it does not own the input or block submission.</div>
7508
7747
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
7509
7748
 
7510
7749
 
7511
- <input id="c-24-components-validationlist-stories" class="tg tg-stories" type="checkbox" hidden />
7750
+ <input id="c-25-components-validationlist-stories" class="tg tg-stories" type="checkbox" hidden />
7512
7751
 
7513
7752
 
7514
- <input id="c-24-components-validationlist-props" class="tg tg-props" type="checkbox" hidden />
7753
+ <input id="c-25-components-validationlist-props" class="tg tg-props" type="checkbox" hidden />
7515
7754
 
7516
7755
  <div class="panels">
7517
7756
 
@@ -4305,6 +4305,274 @@
4305
4305
  ],
4306
4306
  "import": "import { Avatar, Button, HoverCard } from \"@agentero/design-system\";"
4307
4307
  },
4308
+ "components-input": {
4309
+ "id": "components-input",
4310
+ "name": "Input",
4311
+ "path": "./src/input/input.stories.tsx",
4312
+ "jsDocTags": {
4313
+ "summary": [
4314
+ "Base single-line text control, unaware of fields and form libraries"
4315
+ ],
4316
+ "example": [
4317
+ "<Label htmlFor=\"email\">Email</Label>\n<Input id=\"email\" type=\"email\" placeholder=\"you@example.com\" />",
4318
+ "<Input id=\"email\" aria-invalid aria-describedby=\"email-error\" />\n<span id=\"email-error\">Enter a valid email address.</span>"
4319
+ ]
4320
+ },
4321
+ "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.",
4322
+ "summary": "Base single-line text control, unaware of fields and form libraries",
4323
+ "reactComponentMeta": {
4324
+ "displayName": "Input",
4325
+ "exportName": "Input",
4326
+ "filePath": "/home/runner/work/design-system/design-system/src/input/input.tsx",
4327
+ "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.",
4328
+ "jsDocTags": {
4329
+ "summary": [
4330
+ "Base single-line text control, unaware of fields and form libraries"
4331
+ ],
4332
+ "example": [
4333
+ "<Label htmlFor=\"email\">Email</Label>\n<Input id=\"email\" type=\"email\" placeholder=\"you@example.com\" />",
4334
+ "<Input id=\"email\" aria-invalid aria-describedby=\"email-error\" />\n<span id=\"email-error\">Enter a valid email address.</span>"
4335
+ ]
4336
+ },
4337
+ "props": {
4338
+ "aria-invalid": {
4339
+ "name": "aria-invalid",
4340
+ "required": false,
4341
+ "type": {
4342
+ "name": "boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\" | undefined"
4343
+ },
4344
+ "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.",
4345
+ "defaultValue": null,
4346
+ "parent": {
4347
+ "name": "AriaAttributes",
4348
+ "fileName": "node_modules/@types/react/index.d.ts"
4349
+ },
4350
+ "declarations": [
4351
+ {
4352
+ "name": "AriaAttributes",
4353
+ "fileName": "node_modules/@types/react/index.d.ts"
4354
+ },
4355
+ {
4356
+ "name": "TypeLiteral",
4357
+ "fileName": "src/input/input.tsx"
4358
+ }
4359
+ ]
4360
+ },
4361
+ "type": {
4362
+ "name": "type",
4363
+ "required": false,
4364
+ "type": {
4365
+ "name": "HTMLInputTypeAttribute | undefined"
4366
+ },
4367
+ "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.",
4368
+ "defaultValue": null,
4369
+ "parent": {
4370
+ "name": "InputHTMLAttributes",
4371
+ "fileName": "node_modules/@types/react/index.d.ts"
4372
+ },
4373
+ "declarations": [
4374
+ {
4375
+ "name": "InputHTMLAttributes",
4376
+ "fileName": "node_modules/@types/react/index.d.ts"
4377
+ },
4378
+ {
4379
+ "name": "TypeLiteral",
4380
+ "fileName": "src/input/input.tsx"
4381
+ }
4382
+ ]
4383
+ },
4384
+ "disabled": {
4385
+ "name": "disabled",
4386
+ "required": false,
4387
+ "type": {
4388
+ "name": "boolean"
4389
+ },
4390
+ "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.",
4391
+ "defaultValue": null,
4392
+ "parent": {
4393
+ "name": "InputHTMLAttributes",
4394
+ "fileName": "node_modules/@types/react/index.d.ts"
4395
+ },
4396
+ "declarations": [
4397
+ {
4398
+ "name": "InputHTMLAttributes",
4399
+ "fileName": "node_modules/@types/react/index.d.ts"
4400
+ },
4401
+ {
4402
+ "name": "TypeLiteral",
4403
+ "fileName": "src/input/input.tsx"
4404
+ }
4405
+ ]
4406
+ },
4407
+ "placeholder": {
4408
+ "name": "placeholder",
4409
+ "required": false,
4410
+ "type": {
4411
+ "name": "string"
4412
+ },
4413
+ "description": "Short hint shown while the field is empty. It disappears on the first\nkeystroke, so it is never a substitute for a label.",
4414
+ "defaultValue": null,
4415
+ "parent": {
4416
+ "name": "InputHTMLAttributes",
4417
+ "fileName": "node_modules/@types/react/index.d.ts"
4418
+ },
4419
+ "declarations": [
4420
+ {
4421
+ "name": "InputHTMLAttributes",
4422
+ "fileName": "node_modules/@types/react/index.d.ts"
4423
+ },
4424
+ {
4425
+ "name": "TypeLiteral",
4426
+ "fileName": "src/input/input.tsx"
4427
+ }
4428
+ ]
4429
+ },
4430
+ "readOnly": {
4431
+ "name": "readOnly",
4432
+ "required": false,
4433
+ "type": {
4434
+ "name": "boolean"
4435
+ },
4436
+ "description": "Keeps the value focusable and copyable but not editable, and still\nsubmits it. Unlike `disabled`, it stays in the tab order.",
4437
+ "defaultValue": null,
4438
+ "parent": {
4439
+ "name": "InputHTMLAttributes",
4440
+ "fileName": "node_modules/@types/react/index.d.ts"
4441
+ },
4442
+ "declarations": [
4443
+ {
4444
+ "name": "InputHTMLAttributes",
4445
+ "fileName": "node_modules/@types/react/index.d.ts"
4446
+ },
4447
+ {
4448
+ "name": "TypeLiteral",
4449
+ "fileName": "src/input/input.tsx"
4450
+ }
4451
+ ]
4452
+ },
4453
+ "required": {
4454
+ "name": "required",
4455
+ "required": false,
4456
+ "type": {
4457
+ "name": "boolean"
4458
+ },
4459
+ "description": "Marks the control required for both the browser and assistive technology.",
4460
+ "defaultValue": null,
4461
+ "parent": {
4462
+ "name": "InputHTMLAttributes",
4463
+ "fileName": "node_modules/@types/react/index.d.ts"
4464
+ },
4465
+ "declarations": [
4466
+ {
4467
+ "name": "InputHTMLAttributes",
4468
+ "fileName": "node_modules/@types/react/index.d.ts"
4469
+ },
4470
+ {
4471
+ "name": "TypeLiteral",
4472
+ "fileName": "src/input/input.tsx"
4473
+ }
4474
+ ]
4475
+ },
4476
+ "size": {
4477
+ "name": "size",
4478
+ "required": false,
4479
+ "type": {
4480
+ "name": "enum",
4481
+ "raw": "\"sm\" | \"md\" | \"lg\"",
4482
+ "value": [
4483
+ {
4484
+ "value": "\"sm\""
4485
+ },
4486
+ {
4487
+ "value": "\"md\""
4488
+ },
4489
+ {
4490
+ "value": "\"lg\""
4491
+ }
4492
+ ]
4493
+ },
4494
+ "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`.",
4495
+ "defaultValue": null,
4496
+ "parent": {
4497
+ "name": "InputProps",
4498
+ "fileName": "src/input/input.tsx"
4499
+ },
4500
+ "declarations": [
4501
+ {
4502
+ "name": "TypeLiteral",
4503
+ "fileName": "src/input/input.tsx"
4504
+ }
4505
+ ]
4506
+ }
4507
+ }
4508
+ },
4509
+ "stories": [
4510
+ {
4511
+ "id": "components-input--default",
4512
+ "name": "Default",
4513
+ "snippet": "const Default = () => <Input type=\"text\" placeholder=\"Insert value\" aria-label=\"Value\" />;",
4514
+ "description": "The default control at `md`, usable anywhere without a surrounding field.",
4515
+ "summary": "Default standalone input"
4516
+ },
4517
+ {
4518
+ "id": "components-input--small",
4519
+ "name": "Small",
4520
+ "snippet": "const Small = () => <Input type=\"text\" placeholder=\"Insert value\" aria-label=\"Value\" size=\"sm\" />;",
4521
+ "description": "`sm` (32px) keeps dense layouts compact where vertical space is tight.",
4522
+ "summary": "Small 32px control for dense layouts"
4523
+ },
4524
+ {
4525
+ "id": "components-input--medium",
4526
+ "name": "Medium",
4527
+ "snippet": "const Medium = () => <Input type=\"text\" placeholder=\"Insert value\" aria-label=\"Value\" size=\"md\" />;",
4528
+ "description": "`md` (40px) is the default and covers standard form density.",
4529
+ "summary": "Medium 40px control, the default"
4530
+ },
4531
+ {
4532
+ "id": "components-input--large",
4533
+ "name": "Large",
4534
+ "snippet": "const Large = () => <Input type=\"text\" placeholder=\"Insert value\" aria-label=\"Value\" size=\"lg\" />;",
4535
+ "description": "`lg` (48px) suits low-density forms and larger touch targets. It also raises\nthe text to `base` and the corner radius to `lg`.",
4536
+ "summary": "Large 48px control for low-density forms"
4537
+ },
4538
+ {
4539
+ "id": "components-input--all-sizes",
4540
+ "name": "All Sizes",
4541
+ "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>;",
4542
+ "description": "All three heights together for visual comparison.",
4543
+ "summary": "Visual comparison of the three input sizes"
4544
+ },
4545
+ {
4546
+ "id": "components-input--types",
4547
+ "name": "Types",
4548
+ "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>;",
4549
+ "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.",
4550
+ "summary": "Common input types side by side"
4551
+ },
4552
+ {
4553
+ "id": "components-input--invalid",
4554
+ "name": "Invalid",
4555
+ "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>;",
4556
+ "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.",
4557
+ "summary": "Invalid state driven by aria-invalid"
4558
+ },
4559
+ {
4560
+ "id": "components-input--disabled",
4561
+ "name": "Disabled",
4562
+ "snippet": "const Disabled = () => <Input\n type=\"text\"\n placeholder=\"Insert value\"\n aria-label=\"Value\"\n disabled\n defaultValue=\"Cannot be edited\" />;",
4563
+ "description": "A disabled input keeps its value readable but blocks interaction, drops its\nshadow and leaves the tab order.",
4564
+ "summary": "Disabled state"
4565
+ },
4566
+ {
4567
+ "id": "components-input--read-only",
4568
+ "name": "Read Only",
4569
+ "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\" />;",
4570
+ "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.",
4571
+ "summary": "Read-only value that stays focusable and copyable"
4572
+ }
4573
+ ],
4574
+ "import": "import { Input } from \"@agentero/design-system\";"
4575
+ },
4308
4576
  "components-label": {
4309
4577
  "id": "components-label",
4310
4578
  "name": "Label",
@@ -7013,6 +7281,6 @@
7013
7281
  },
7014
7282
  "meta": {
7015
7283
  "docgen": "react-component-meta",
7016
- "durationMs": 3272
7284
+ "durationMs": 3983
7017
7285
  }
7018
7286
  }
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.0",
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"
@@ -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 };