@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.
- package/mcp/manifests/components.html +295 -56
- package/mcp/manifests/components.json +269 -1
- package/package.json +5 -1
- package/src/input/index.d.ts +2 -0
- package/src/input/index.js +2 -0
- package/src/input/input.d.ts +109 -0
- package/src/input/input.js +35 -0
|
@@ -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">
|
|
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>
|
|
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: <Label htmlFor="email">Email</Label>
|
|
4538
|
+
<Input id="email" type="email" placeholder="you@example.com" /></span><span class="chip">example: <Input id="email" aria-invalid aria-describedby="email-error" />
|
|
4539
|
+
<span id="email-error">Enter a valid email address.</span></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 | "true" | "false" | "grammar" | "spelling" | 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 `'md'`.
|
|
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?: "sm" | "md" | "lg"
|
|
4602
|
+
|
|
4603
|
+
/**
|
|
4604
|
+
* Native input type. Picks the on-screen keyboard on touch devices and the
|
|
4605
|
+
* browser's own parsing, so set it even when you validate yourself.
|
|
4606
|
+
* Defaults to `'text'`. 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 = () => <Input type="text" placeholder="Insert value" aria-label="Value" />;</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 = () => <Input type="text" placeholder="Insert value" aria-label="Value" size="sm" />;</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 = () => <Input type="text" placeholder="Insert value" aria-label="Value" size="md" />;</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 = () => <Input type="text" placeholder="Insert value" aria-label="Value" size="lg" />;</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 = () => <div style={{ display: 'grid', gap: '1rem', maxWidth: '20rem' }}>
|
|
4670
|
+
<Input type="text" size="sm" aria-label="Small input" placeholder="sm — 32px" />
|
|
4671
|
+
<Input type="text" size="md" aria-label="Medium input" placeholder="md — 40px" />
|
|
4672
|
+
<Input type="text" size="lg" aria-label="Large input" placeholder="lg — 48px" />
|
|
4673
|
+
</div>;</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's own parsing, so set it even when you validate
|
|
4683
|
+
yourself.</div>
|
|
4684
|
+
<pre><code>const Types = () => <div style={{ display: 'grid', gap: '1rem', maxWidth: '20rem' }}>
|
|
4685
|
+
<Input type="text" aria-label="Text" placeholder="Text" />
|
|
4686
|
+
<Input type="email" aria-label="Email address" placeholder="you@example.com" />
|
|
4687
|
+
<Input type="password" aria-label="Password" placeholder="Password" />
|
|
4688
|
+
<Input type="number" aria-label="Amount" placeholder="0" />
|
|
4689
|
+
<Input type="date" aria-label="Date" placeholder="" />
|
|
4690
|
+
</div>;</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 = () => <div style={{ display: 'grid', gap: '0.25rem', maxWidth: '20rem' }}>
|
|
4702
|
+
<Input
|
|
4703
|
+
type="email"
|
|
4704
|
+
placeholder="Insert value"
|
|
4705
|
+
aria-label="Email"
|
|
4706
|
+
aria-invalid
|
|
4707
|
+
aria-describedby="email-error"
|
|
4708
|
+
defaultValue="not-an-email" />
|
|
4709
|
+
<span id="email-error">Enter a valid email address.</span>
|
|
4710
|
+
</div>;</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 = () => <Input
|
|
4721
|
+
type="text"
|
|
4722
|
+
placeholder="Insert value"
|
|
4723
|
+
aria-label="Value"
|
|
4724
|
+
disabled
|
|
4725
|
+
defaultValue="Cannot be edited" />;</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 = () => <Input
|
|
4737
|
+
type="text"
|
|
4738
|
+
placeholder="Insert value"
|
|
4739
|
+
aria-label="Value"
|
|
4740
|
+
readOnly
|
|
4741
|
+
defaultValue="Copy me, but do not change me" />;</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-
|
|
4760
|
+
<label for="c-12-components-label-props" class="badge ok as-toggle">3 prop types</label>
|
|
4522
4761
|
|
|
4523
|
-
<label for="c-
|
|
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-
|
|
4782
|
+
<input id="c-12-components-label-stories" class="tg tg-stories" type="checkbox" hidden />
|
|
4544
4783
|
|
|
4545
4784
|
|
|
4546
|
-
<input id="c-
|
|
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-
|
|
4883
|
+
<label for="c-13-components-loading-props" class="badge ok as-toggle">1 prop type</label>
|
|
4645
4884
|
|
|
4646
|
-
<label for="c-
|
|
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-
|
|
4902
|
+
<input id="c-13-components-loading-stories" class="tg tg-stories" type="checkbox" hidden />
|
|
4664
4903
|
|
|
4665
4904
|
|
|
4666
|
-
<input id="c-
|
|
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-
|
|
5056
|
+
<label for="c-14-components-modal-props" class="badge ok as-toggle">5 prop types</label>
|
|
4818
5057
|
|
|
4819
|
-
<label for="c-
|
|
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 '@agentero/design-system/modal';
|
|
|
4862
5101
|
<!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
|
|
4863
5102
|
|
|
4864
5103
|
|
|
4865
|
-
<input id="c-
|
|
5104
|
+
<input id="c-14-components-modal-stories" class="tg tg-stories" type="checkbox" hidden />
|
|
4866
5105
|
|
|
4867
5106
|
|
|
4868
|
-
<input id="c-
|
|
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-
|
|
5304
|
+
<label for="c-15-components-pagination-props" class="badge ok as-toggle">5 prop types</label>
|
|
5066
5305
|
|
|
5067
|
-
<label for="c-
|
|
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-
|
|
5336
|
+
<input id="c-15-components-pagination-stories" class="tg tg-stories" type="checkbox" hidden />
|
|
5098
5337
|
|
|
5099
5338
|
|
|
5100
|
-
<input id="c-
|
|
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-
|
|
5494
|
+
<label for="c-16-components-popover-props" class="badge ok as-toggle">5 prop types</label>
|
|
5256
5495
|
|
|
5257
|
-
<label for="c-
|
|
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 '@agentero/design-system/popover';
|
|
|
5283
5522
|
<!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
|
|
5284
5523
|
|
|
5285
5524
|
|
|
5286
|
-
<input id="c-
|
|
5525
|
+
<input id="c-16-components-popover-stories" class="tg tg-stories" type="checkbox" hidden />
|
|
5287
5526
|
|
|
5288
5527
|
|
|
5289
|
-
<input id="c-
|
|
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-
|
|
5683
|
+
<label for="c-17-components-progress-props" class="badge ok as-toggle">4 prop types</label>
|
|
5445
5684
|
|
|
5446
|
-
<label for="c-
|
|
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-
|
|
5704
|
+
<input id="c-17-components-progress-stories" class="tg tg-stories" type="checkbox" hidden />
|
|
5466
5705
|
|
|
5467
5706
|
|
|
5468
|
-
<input id="c-
|
|
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-
|
|
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-
|
|
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-
|
|
5939
|
+
<label for="c-19-components-switch-props" class="badge ok as-toggle">8 prop types</label>
|
|
5701
5940
|
|
|
5702
|
-
<label for="c-
|
|
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-
|
|
5957
|
+
<input id="c-19-components-switch-stories" class="tg tg-stories" type="checkbox" hidden />
|
|
5719
5958
|
|
|
5720
5959
|
|
|
5721
|
-
<input id="c-
|
|
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?: "sm" | "md"</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-
|
|
6141
|
+
<label for="c-20-components-table-props" class="badge ok as-toggle">6 prop types</label>
|
|
5903
6142
|
|
|
5904
|
-
<label for="c-
|
|
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 '@agentero/design-system/table';
|
|
|
5932
6171
|
<!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
|
|
5933
6172
|
|
|
5934
6173
|
|
|
5935
|
-
<input id="c-
|
|
6174
|
+
<input id="c-20-components-table-stories" class="tg tg-stories" type="checkbox" hidden />
|
|
5936
6175
|
|
|
5937
6176
|
|
|
5938
|
-
<input id="c-
|
|
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-
|
|
6372
|
+
<label for="c-21-components-tabs-props" class="badge ok as-toggle">9 prop types</label>
|
|
6134
6373
|
|
|
6135
|
-
<label for="c-
|
|
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 '@agentero/design-system/tabs';
|
|
|
6163
6402
|
<!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
|
|
6164
6403
|
|
|
6165
6404
|
|
|
6166
|
-
<input id="c-
|
|
6405
|
+
<input id="c-21-components-tabs-stories" class="tg tg-stories" type="checkbox" hidden />
|
|
6167
6406
|
|
|
6168
6407
|
|
|
6169
|
-
<input id="c-
|
|
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-
|
|
6629
|
+
<label for="c-22-components-tag-props" class="badge ok as-toggle">8 prop types</label>
|
|
6391
6630
|
|
|
6392
|
-
<label for="c-
|
|
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-
|
|
6650
|
+
<input id="c-22-components-tag-stories" class="tg tg-stories" type="checkbox" hidden />
|
|
6412
6651
|
|
|
6413
6652
|
|
|
6414
|
-
<input id="c-
|
|
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-
|
|
7078
|
+
<label for="c-23-components-toast-props" class="badge ok as-toggle">11 prop types</label>
|
|
6840
7079
|
|
|
6841
|
-
<label for="c-
|
|
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-
|
|
7099
|
+
<input id="c-23-components-toast-stories" class="tg tg-stories" type="checkbox" hidden />
|
|
6861
7100
|
|
|
6862
7101
|
|
|
6863
|
-
<input id="c-
|
|
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-
|
|
7531
|
+
<label for="c-24-components-tooltip-props" class="badge ok as-toggle">12 prop types</label>
|
|
7293
7532
|
|
|
7294
|
-
<label for="c-
|
|
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-
|
|
7552
|
+
<input id="c-24-components-tooltip-stories" class="tg tg-stories" type="checkbox" hidden />
|
|
7314
7553
|
|
|
7315
7554
|
|
|
7316
|
-
<input id="c-
|
|
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-
|
|
7727
|
+
<label for="c-25-components-validationlist-props" class="badge ok as-toggle">2 prop types</label>
|
|
7489
7728
|
|
|
7490
|
-
<label for="c-
|
|
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-
|
|
7750
|
+
<input id="c-25-components-validationlist-stories" class="tg tg-stories" type="checkbox" hidden />
|
|
7512
7751
|
|
|
7513
7752
|
|
|
7514
|
-
<input id="c-
|
|
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":
|
|
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.
|
|
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,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 };
|