@agentero/design-system 0.33.1 → 0.34.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">35 components ok</span><span class="filter-pill ok" aria-disabled="true">288 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">36 components ok</span><span class="filter-pill ok" aria-disabled="true">294 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.9s</strong>.
597
+ Using <code>react-component-meta</code>. Generation took <strong>3.8s</strong>.
598
598
  </div>
599
599
  <h2 class="section-title">Components</h2>
600
600
  <div class="grid" role="list">
@@ -3170,8 +3170,8 @@ import { Suspense } from "react";</code></pre>
3170
3170
  <div>Search field with a magnifier and clear button over an in-memory list</div>
3171
3171
  <div class="hint">The common case: options are already in memory and Base UI filters them against
3172
3172
  what you type. Selecting a row fills the input and closes the list. The field is
3173
- a search out of the box — a magnifier in front, a clear button once something is
3174
- picked — and the list hangs from the whole field.</div>
3173
+ a search out of the box — a magnifier in front, a clear button once there is
3174
+ text — and the list hangs from the whole field. Clearing drops the picked option.</div>
3175
3175
  <pre><code>const Default = () =&gt; (
3176
3176
  &lt;Combobox.Root items={STATES}&gt;
3177
3177
  &lt;Combobox.Input placeholder=&quot;Search states&quot; aria-label=&quot;Search states&quot; /&gt;
@@ -3339,11 +3339,19 @@ here as tags.</div>
3339
3339
 
3340
3340
  <div class="hint">Options fetched as you type, the way the apps load data: the rows are a component
3341
3341
  that suspends on the request, so a `Suspense` boundary inside `Content` shows
3342
- placeholder rows until they land. Nothing tracks `loading` by hand and no stale
3343
- list lingers under the wait: the data is read by query, which is also what makes
3344
- out-of-order responses harmless. Drop a `useSuspenseQuery` where `use()` is.</div>
3342
+ placeholder rows until the first results land. The rows read a deferred copy of
3343
+ the query, so a new search keeps the previous rows on screen while it loads and
3344
+ `Content` is marked busy until they are replaced; the placeholders never come
3345
+ back. Nothing tracks `loading` by hand, and reading the data by query is what
3346
+ makes out-of-order responses harmless. With react-query, drop a
3347
+ `useSuspenseQuery` where `use()` is, or use `placeholderData: keepPreviousData`
3348
+ with a plain `useQuery` for the same behaviour.</div>
3345
3349
  <pre><code>const AsyncSearch = () =&gt; {
3346
3350
  const [query, setQuery] = useState(&#39;&#39;);
3351
+ // The rows read the deferred query: while the new one suspends, React keeps rendering the
3352
+ // old rows instead of falling back to the placeholders.
3353
+ const deferredQuery = useDeferredValue(query);
3354
+ const isStale = query !== deferredQuery;
3347
3355
 
3348
3356
  return (
3349
3357
  // No `items` and `filter={null}`: the server did the filtering, the child renders what came
@@ -3357,9 +3365,9 @@ out-of-order responses harmless. Drop a `useSuspenseQuery` where `use()` is.</di
3357
3365
  if (reason !== &#39;item-press&#39;) setQuery(value);
3358
3366
  }}&gt;
3359
3367
  &lt;Combobox.Input placeholder=&quot;Search agencies&quot; aria-label=&quot;Search agencies&quot; /&gt;
3360
- &lt;Combobox.Content&gt;
3368
+ &lt;Combobox.Content aria-busy={isStale || undefined}&gt;
3361
3369
  &lt;Suspense fallback={&lt;SkeletonRows /&gt;}&gt;
3362
- &lt;AgencyItems query={query} /&gt;
3370
+ &lt;AgencyItems query={deferredQuery} /&gt;
3363
3371
  &lt;/Suspense&gt;
3364
3372
  &lt;/Combobox.Content&gt;
3365
3373
  &lt;/Combobox.Root&gt;
@@ -3374,8 +3382,10 @@ out-of-order responses harmless. Drop a `useSuspenseQuery` where `use()` is.</di
3374
3382
  <div>API search that waits for two characters, with loading status</div>
3375
3383
  <div class="hint">The same search without Suspense, for a consumer that gets a `loading` flag from
3376
3384
  its data layer instead: `filter={null}`, the rows arrive through `filteredItems`,
3377
- `Content` is marked busy and `Status` announces the wait. The list is cleared
3378
- before each request and a request that is no longer the latest is dropped.
3385
+ `Content` is marked busy and `Status` announces the wait. Placeholder rows show
3386
+ only while there is nothing to show yet; after that, the previous rows stay
3387
+ until the new ones replace them. A request that is no longer the latest is
3388
+ dropped.
3379
3389
 
3380
3390
  `minInputLength` keeps the list shut until two characters are typed — focusing
3381
3391
  the field opens nothing, and deleting back under the minimum closes it — and
@@ -3394,9 +3404,7 @@ no request goes out for a shorter query either.</div>
3394
3404
  return;
3395
3405
  }
3396
3406
 
3397
- // The previous rows go before the wait starts: a list that no longer matches what is typed
3398
- // must not sit under the loading state.
3399
- setResults([]);
3407
+ // The previous rows stay through the wait, marked busy, rather than blinking out and back.
3400
3408
  setIsLoading(true);
3401
3409
  const agencies = await searchAgencies(query);
3402
3410
  if (request !== latestRequest.current) return;
@@ -3421,7 +3429,7 @@ no request goes out for a shorter query either.</div>
3421
3429
  &lt;Combobox.Status className=&quot;sr-only&quot;&gt;
3422
3430
  {isLoading ? &#39;Searching…&#39; : undefined}
3423
3431
  &lt;/Combobox.Status&gt;
3424
- {isLoading &amp;&amp; &lt;SkeletonRows /&gt;}
3432
+ {isLoading &amp;&amp; results.length === 0 &amp;&amp; &lt;SkeletonRows /&gt;}
3425
3433
  &lt;Combobox.Empty&gt;{isLoading ? undefined : &#39;No agencies found&#39;}&lt;/Combobox.Empty&gt;
3426
3434
  &lt;Combobox.List&gt;
3427
3435
  {(agency: Agency) =&gt; (
@@ -7176,7 +7184,7 @@ they cannot change.</div>
7176
7184
  <div class="badges">
7177
7185
 
7178
7186
 
7179
- <label for="c-18-components-inputgroup-stories" class="badge ok as-toggle">13 stories</label>
7187
+ <label for="c-18-components-inputgroup-stories" class="badge ok as-toggle">12 stories</label>
7180
7188
 
7181
7189
 
7182
7190
  </div>
@@ -7223,7 +7231,6 @@ hands its state to the frame through `:has()`, so focus, `disabled`,
7223
7231
  DropdownMenu,
7224
7232
  Field,
7225
7233
  FieldText,
7226
- IconCancel,
7227
7234
  IconKeyboardArrowDown,
7228
7235
  IconSearch,
7229
7236
  Input,
@@ -7242,7 +7249,9 @@ hands its state to the frame through `:has()`, so focus, `disabled`,
7242
7249
  <div>Leading icon addon with the frame drawing the focus ring</div>
7243
7250
  <div class="hint">A search field: the icon leads and the input takes the rest of the frame.
7244
7251
  Pressing the icon focuses the input, and the frame — not the input — draws the
7245
- focus ring, so the two never show a double border.</div>
7252
+ focus ring, so the two never show a double border. A search field with a
7253
+ clear button and a loading state is
7254
+ [InputSearch](?path=/docs/components-inputsearch--docs), built on this frame.</div>
7246
7255
  <pre><code>const Default = () =&gt; (
7247
7256
  &lt;InputGroup.Root&gt;
7248
7257
  &lt;InputGroup.Addon&gt;
@@ -7413,25 +7422,6 @@ describes it with no ids written by hand. The frame is not in the way.</div>
7413
7422
  &lt;/InputGroup.Root&gt;
7414
7423
  &lt;Field.Description&gt;Shown on your public profile.&lt;/Field.Description&gt;
7415
7424
  &lt;/FieldText&gt;
7416
- );</code></pre>
7417
- </div>
7418
- <div class="note ok">
7419
- <div class="row">
7420
- <span class="ex-name">Search Field</span>
7421
- <span class="badge ok">story ok</span>
7422
- </div>
7423
-
7424
-
7425
- <pre><code>const SearchField = () =&gt; (
7426
- &lt;form onSubmit={handleSearchSubmit}&gt;
7427
- &lt;FieldStates
7428
- label=&quot;Agency&quot;
7429
- tooltip=&quot;Search by agency name or NPN.&quot;
7430
- required
7431
- error=&quot;Pick an agency from the list.&quot;&gt;
7432
- &lt;SearchInput /&gt;
7433
- &lt;/FieldStates&gt;
7434
- &lt;/form&gt;
7435
7425
  );</code></pre>
7436
7426
  </div>
7437
7427
  <div class="note ok">
@@ -7655,6 +7645,236 @@ the field through the frame. A disabled field removes the toggle too.</div>
7655
7645
  </div>
7656
7646
 
7657
7647
 
7648
+ </div>
7649
+ </article>
7650
+ <article
7651
+ class="card
7652
+ no-error
7653
+ no-info
7654
+ no-story-error
7655
+ no-doc-error"
7656
+ role="listitem"
7657
+ aria-label="InputSearch">
7658
+ <div class="head">
7659
+ <div class="title">
7660
+ <h2><span class="status-dot dot-ok"></span> InputSearch</h2>
7661
+ <div class="badges">
7662
+ <label for="c-20-components-inputsearch-props" class="badge ok as-toggle">3 prop types</label>
7663
+
7664
+ <label for="c-20-components-inputsearch-stories" class="badge ok as-toggle">7 stories</label>
7665
+
7666
+
7667
+ </div>
7668
+ </div>
7669
+ <div class="meta" title="./src/input-search/input-search.stories.tsx">components-inputsearch · ./src/input-search/input-search.stories.tsx</div>
7670
+ <div>Search input with a leading icon, a clear button and a loading slot</div>
7671
+ <div class="hint">InputSearch is a search field with a magnifier in front and a clear button
7672
+ once there is text. It is an `Input` of `type=&quot;search&quot;` inside an
7673
+ `InputGroup`: `className` styles the frame and every other prop reaches the
7674
+ `&lt;input&gt;`. Clearing reports a real change event with an empty value, and
7675
+ `isLoading` swaps the clear button for a spinner.</div>
7676
+ <div class="kv"><span class="chip">summary: Search input with a leading icon, a clear button and a loading slot</span><span class="chip">dataAttribute: {string} data-slot - Always set to &quot;input-search&quot; on the frame</span><span class="chip">example: &lt;InputSearch
7677
+ aria-label=&quot;Search agencies&quot;
7678
+ value={query}
7679
+ onChange={event =&gt; setQuery(event.target.value)}
7680
+ isLoading={isFetching}
7681
+ /&gt;</span></div>
7682
+ </div>
7683
+
7684
+ <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
7685
+
7686
+
7687
+ <input id="c-20-components-inputsearch-stories" class="tg tg-stories" type="checkbox" hidden />
7688
+
7689
+
7690
+ <input id="c-20-components-inputsearch-props" class="tg tg-props" type="checkbox" hidden />
7691
+
7692
+ <div class="panels">
7693
+
7694
+
7695
+
7696
+ <div class="panel panel-props">
7697
+ <div class="note ok">
7698
+ <div class="row">
7699
+ <span class="ex-name">Prop types <small>(react-component-meta)</small></span>
7700
+ <span class="badge ok">3 prop types</span>
7701
+ </div>
7702
+ <pre><code>Component: src/input-search/input-search.tsx::InputSearch</code></pre>
7703
+ <pre><code>Props:</code></pre>
7704
+ <pre><code>/**
7705
+ * Accessible name of the clear button. Defaults to `&#39;Clear search&#39;`; name it
7706
+ * after what is searched (`&#39;Clear agency search&#39;`) when a page carries
7707
+ * several search fields.
7708
+ */
7709
+ clearLabel?: string = &#39;Clear search&#39;
7710
+
7711
+ /**
7712
+ * Shows a spinner at the end of the frame, in place of the clear button,
7713
+ * while the results for the current text are on their way. Defaults to
7714
+ * `false`.
7715
+ */
7716
+ isLoading?: boolean = false
7717
+
7718
+ /**
7719
+ * Control height. Defaults to `&#39;md&#39;`.
7720
+ * - `sm` (32px) — dense layouts where vertical space is tight.
7721
+ * - `md` (40px) — standard form density.
7722
+ * - `lg` (48px) — low-density forms and larger touch targets. Also raises
7723
+ * the text to `base` and the corner radius to `lg`.
7724
+ */
7725
+ size?: &quot;sm&quot; | &quot;md&quot; | &quot;lg&quot;</code></pre>
7726
+ </div>
7727
+ </div>
7728
+
7729
+ <div class="panel panel-stories">
7730
+
7731
+
7732
+
7733
+ <div class="note ok">
7734
+ <div class="row">
7735
+ <span class="ex-name">Imports</span>
7736
+ </div>
7737
+ <pre><code>import { Field, FieldText, InputSearch, Label } from "@agentero/design-system";</code></pre>
7738
+ </div>
7739
+
7740
+
7741
+ <div class="note ok">
7742
+ <div class="row">
7743
+ <span class="ex-name">Default</span>
7744
+ <span class="badge ok">story ok</span>
7745
+ </div>
7746
+ <div>Controlled search with a clear button that empties the query</div>
7747
+ <div class="hint">A controlled search. The clear button appears once there is text; pressing
7748
+ it calls `onChange` with an empty `event.target.value`, so the state that
7749
+ owns the query empties too, and focus goes back to the input. The browser&#39;s
7750
+ own cancel button is hidden.</div>
7751
+ <pre><code>const Default = () =&gt; {
7752
+ const [query, setQuery] = useState(&#39;&#39;);
7753
+
7754
+ return (
7755
+ &lt;InputSearch
7756
+ aria-label=&quot;Search agencies&quot;
7757
+ value={query}
7758
+ onChange={event =&gt; {
7759
+ setQuery(event.target.value);
7760
+ args.onChange?.(event);
7761
+ }} /&gt;
7762
+ );
7763
+ };</code></pre>
7764
+ </div>
7765
+ <div class="note ok">
7766
+ <div class="row">
7767
+ <span class="ex-name">Loading</span>
7768
+ <span class="badge ok">story ok</span>
7769
+ </div>
7770
+ <div>Spinner in place of the clear button while results load</div>
7771
+ <div class="hint">While `isLoading` is set a spinner takes the clear button&#39;s place, even with
7772
+ text in the field.</div>
7773
+ <pre><code>const Loading = () =&gt; &lt;InputSearch
7774
+ aria-label=&quot;Search agencies&quot;
7775
+ onChange={fn((event: ChangeEvent&lt;HTMLInputElement&gt;) =&gt; event.target.value)}
7776
+ isLoading
7777
+ defaultValue=&quot;Acme&quot; /&gt;;</code></pre>
7778
+ </div>
7779
+ <div class="note ok">
7780
+ <div class="row">
7781
+ <span class="ex-name">Uncontrolled</span>
7782
+ <span class="badge ok">story ok</span>
7783
+ </div>
7784
+ <div>Uncontrolled search starting from a default value</div>
7785
+ <div class="hint">An uncontrolled search with a `defaultValue`. The clear button follows what
7786
+ is in the field, and clearing still calls `onChange` with an empty value.</div>
7787
+ <pre><code>const Uncontrolled = () =&gt; &lt;InputSearch
7788
+ aria-label=&quot;Search agencies&quot;
7789
+ onChange={fn((event: ChangeEvent&lt;HTMLInputElement&gt;) =&gt; event.target.value)}
7790
+ defaultValue=&quot;Acme Insurance&quot; /&gt;;</code></pre>
7791
+ </div>
7792
+ <div class="note ok">
7793
+ <div class="row">
7794
+ <span class="ex-name">Disabled</span>
7795
+ <span class="badge ok">story ok</span>
7796
+ </div>
7797
+ <div>Disabled search with the clear button removed</div>
7798
+ <div class="hint">A disabled search has no clear button, whether `disabled` is set on the
7799
+ input itself or comes from a `&lt;fieldset disabled&gt;` around it.</div>
7800
+ <pre><code>const Disabled = () =&gt; &lt;div style={{ display: &#39;grid&#39;, gap: &#39;1rem&#39; }}&gt;
7801
+ &lt;InputSearch
7802
+ aria-label=&quot;Search agencies&quot;
7803
+ onChange={fn((event: ChangeEvent&lt;HTMLInputElement&gt;) =&gt; event.target.value)}
7804
+ disabled
7805
+ defaultValue=&quot;Acme&quot; /&gt;
7806
+ &lt;fieldset disabled style={{ border: 0, margin: 0, padding: 0 }}&gt;
7807
+ &lt;InputSearch
7808
+ onChange={fn((event: ChangeEvent&lt;HTMLInputElement&gt;) =&gt; event.target.value)}
7809
+ aria-label=&quot;Search carriers&quot;
7810
+ defaultValue=&quot;Travelers&quot; /&gt;
7811
+ &lt;/fieldset&gt;
7812
+ &lt;/div&gt;;</code></pre>
7813
+ </div>
7814
+ <div class="note ok">
7815
+ <div class="row">
7816
+ <span class="ex-name">All Sizes</span>
7817
+ <span class="badge ok">story ok</span>
7818
+ </div>
7819
+ <div>The three sizes side by side</div>
7820
+ <div class="hint">The three sizes match Input&#39;s: the frame is 32, 40 or 48px tall.</div>
7821
+ <pre><code>const AllSizes = () =&gt; &lt;div style={{ display: &#39;grid&#39;, gap: &#39;1rem&#39; }}&gt;
7822
+ &lt;InputSearch
7823
+ onChange={fn((event: ChangeEvent&lt;HTMLInputElement&gt;) =&gt; event.target.value)}
7824
+ size=&quot;sm&quot;
7825
+ aria-label=&quot;Small&quot;
7826
+ defaultValue=&quot;Acme&quot; /&gt;
7827
+ &lt;InputSearch
7828
+ onChange={fn((event: ChangeEvent&lt;HTMLInputElement&gt;) =&gt; event.target.value)}
7829
+ size=&quot;md&quot;
7830
+ aria-label=&quot;Medium&quot;
7831
+ defaultValue=&quot;Acme&quot; /&gt;
7832
+ &lt;InputSearch
7833
+ onChange={fn((event: ChangeEvent&lt;HTMLInputElement&gt;) =&gt; event.target.value)}
7834
+ size=&quot;lg&quot;
7835
+ aria-label=&quot;Large&quot;
7836
+ defaultValue=&quot;Acme&quot; /&gt;
7837
+ &lt;/div&gt;;</code></pre>
7838
+ </div>
7839
+ <div class="note ok">
7840
+ <div class="row">
7841
+ <span class="ex-name">Inside Field Text</span>
7842
+ <span class="badge ok">story ok</span>
7843
+ </div>
7844
+ <div>Label and disabled state reaching the input through the frame</div>
7845
+ <div class="hint">Inside a `FieldText` the input takes its label, description and states from
7846
+ the field through the frame. A disabled field removes the clear button too.</div>
7847
+ <pre><code>const InsideFieldText = () =&gt; (
7848
+ &lt;div style={{ display: &#39;grid&#39;, gap: &#39;1.5rem&#39; }}&gt;
7849
+ &lt;FieldText&gt;
7850
+ &lt;Label&gt;Agency&lt;/Label&gt;
7851
+ &lt;InputSearch defaultValue=&quot;Acme&quot; /&gt;
7852
+ &lt;Field.Description&gt;Search by agency name or NPN.&lt;/Field.Description&gt;
7853
+ &lt;/FieldText&gt;
7854
+ &lt;FieldText disabled&gt;
7855
+ &lt;Label&gt;Carrier&lt;/Label&gt;
7856
+ &lt;InputSearch defaultValue=&quot;Travelers&quot; /&gt;
7857
+ &lt;/FieldText&gt;
7858
+ &lt;/div&gt;
7859
+ );</code></pre>
7860
+ </div>
7861
+ <div class="note ok">
7862
+ <div class="row">
7863
+ <span class="ex-name">Clear Label</span>
7864
+ <span class="badge ok">story ok</span>
7865
+ </div>
7866
+ <div>Clear button named after what the field searches</div>
7867
+ <div class="hint">`clearLabel` names the clear button after what is searched, so a page with
7868
+ several search fields does not read &quot;Clear search&quot; twice.</div>
7869
+ <pre><code>const ClearLabel = () =&gt; &lt;InputSearch
7870
+ aria-label=&quot;Search agencies&quot;
7871
+ onChange={fn((event: ChangeEvent&lt;HTMLInputElement&gt;) =&gt; event.target.value)}
7872
+ defaultValue=&quot;Acme&quot;
7873
+ clearLabel=&quot;Clear agency search&quot; /&gt;;</code></pre>
7874
+ </div>
7875
+ </div>
7876
+
7877
+
7658
7878
  </div>
7659
7879
  </article>
7660
7880
  <article
@@ -7669,9 +7889,9 @@ the field through the frame. A disabled field removes the toggle too.</div>
7669
7889
  <div class="title">
7670
7890
  <h2><span class="status-dot dot-ok"></span> Label</h2>
7671
7891
  <div class="badges">
7672
- <label for="c-20-components-label-props" class="badge ok as-toggle">3 prop types</label>
7892
+ <label for="c-21-components-label-props" class="badge ok as-toggle">3 prop types</label>
7673
7893
 
7674
- <label for="c-20-components-label-stories" class="badge ok as-toggle">5 stories</label>
7894
+ <label for="c-21-components-label-stories" class="badge ok as-toggle">5 stories</label>
7675
7895
 
7676
7896
 
7677
7897
  </div>
@@ -7691,10 +7911,10 @@ still has to carry `required` / `aria-required`.</div>
7691
7911
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
7692
7912
 
7693
7913
 
7694
- <input id="c-20-components-label-stories" class="tg tg-stories" type="checkbox" hidden />
7914
+ <input id="c-21-components-label-stories" class="tg tg-stories" type="checkbox" hidden />
7695
7915
 
7696
7916
 
7697
- <input id="c-20-components-label-props" class="tg tg-props" type="checkbox" hidden />
7917
+ <input id="c-21-components-label-props" class="tg tg-props" type="checkbox" hidden />
7698
7918
 
7699
7919
  <div class="panels">
7700
7920
 
@@ -7814,9 +8034,9 @@ field&#39;s control with no `htmlFor`. An explicit `htmlFor` still wins.</div>
7814
8034
  <div class="title">
7815
8035
  <h2><span class="status-dot dot-ok"></span> Loading</h2>
7816
8036
  <div class="badges">
7817
- <label for="c-21-components-loading-props" class="badge ok as-toggle">1 prop type</label>
8037
+ <label for="c-22-components-loading-props" class="badge ok as-toggle">1 prop type</label>
7818
8038
 
7819
- <label for="c-21-components-loading-stories" class="badge ok as-toggle">7 stories</label>
8039
+ <label for="c-22-components-loading-stories" class="badge ok as-toggle">7 stories</label>
7820
8040
 
7821
8041
 
7822
8042
  </div>
@@ -7833,10 +8053,10 @@ parent font size via `em`-based size variants (`sm`, `md`, `lg`).</div>
7833
8053
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
7834
8054
 
7835
8055
 
7836
- <input id="c-21-components-loading-stories" class="tg tg-stories" type="checkbox" hidden />
8056
+ <input id="c-22-components-loading-stories" class="tg tg-stories" type="checkbox" hidden />
7837
8057
 
7838
8058
 
7839
- <input id="c-21-components-loading-props" class="tg tg-props" type="checkbox" hidden />
8059
+ <input id="c-22-components-loading-props" class="tg tg-props" type="checkbox" hidden />
7840
8060
 
7841
8061
  <div class="panels">
7842
8062
 
@@ -7987,9 +8207,9 @@ against the dark background.</div>
7987
8207
  <div class="title">
7988
8208
  <h2><span class="status-dot dot-ok"></span> Modal.Root</h2>
7989
8209
  <div class="badges">
7990
- <label for="c-22-components-modal-props" class="badge ok as-toggle">5 prop types</label>
8210
+ <label for="c-23-components-modal-props" class="badge ok as-toggle">5 prop types</label>
7991
8211
 
7992
- <label for="c-22-components-modal-stories" class="badge ok as-toggle">6 stories</label>
8212
+ <label for="c-23-components-modal-stories" class="badge ok as-toggle">6 stories</label>
7993
8213
 
7994
8214
 
7995
8215
  </div>
@@ -8035,10 +8255,10 @@ import { Modal } from &#39;@agentero/design-system/modal&#39;;
8035
8255
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
8036
8256
 
8037
8257
 
8038
- <input id="c-22-components-modal-stories" class="tg tg-stories" type="checkbox" hidden />
8258
+ <input id="c-23-components-modal-stories" class="tg tg-stories" type="checkbox" hidden />
8039
8259
 
8040
8260
 
8041
- <input id="c-22-components-modal-props" class="tg tg-props" type="checkbox" hidden />
8261
+ <input id="c-23-components-modal-props" class="tg tg-props" type="checkbox" hidden />
8042
8262
 
8043
8263
  <div class="panels">
8044
8264
 
@@ -8258,9 +8478,9 @@ announced as an `alertdialog`. Only the footer actions close it.</div>
8258
8478
  <div class="title">
8259
8479
  <h2><span class="status-dot dot-ok"></span> Pagination</h2>
8260
8480
  <div class="badges">
8261
- <label for="c-23-components-pagination-props" class="badge ok as-toggle">5 prop types</label>
8481
+ <label for="c-24-components-pagination-props" class="badge ok as-toggle">5 prop types</label>
8262
8482
 
8263
- <label for="c-23-components-pagination-stories" class="badge ok as-toggle">7 stories</label>
8483
+ <label for="c-24-components-pagination-stories" class="badge ok as-toggle">7 stories</label>
8264
8484
 
8265
8485
 
8266
8486
  </div>
@@ -8290,10 +8510,10 @@ const [page, setPage] = useState(1);
8290
8510
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
8291
8511
 
8292
8512
 
8293
- <input id="c-23-components-pagination-stories" class="tg tg-stories" type="checkbox" hidden />
8513
+ <input id="c-24-components-pagination-stories" class="tg tg-stories" type="checkbox" hidden />
8294
8514
 
8295
8515
 
8296
- <input id="c-23-components-pagination-props" class="tg tg-props" type="checkbox" hidden />
8516
+ <input id="c-24-components-pagination-props" class="tg tg-props" type="checkbox" hidden />
8297
8517
 
8298
8518
  <div class="panels">
8299
8519
 
@@ -8448,9 +8668,9 @@ entries summary follow along.</div>
8448
8668
  <div class="title">
8449
8669
  <h2><span class="status-dot dot-ok"></span> Popover.Root</h2>
8450
8670
  <div class="badges">
8451
- <label for="c-24-components-popover-props" class="badge ok as-toggle">5 prop types</label>
8671
+ <label for="c-25-components-popover-props" class="badge ok as-toggle">5 prop types</label>
8452
8672
 
8453
- <label for="c-24-components-popover-stories" class="badge ok as-toggle">5 stories</label>
8673
+ <label for="c-25-components-popover-stories" class="badge ok as-toggle">5 stories</label>
8454
8674
 
8455
8675
 
8456
8676
  </div>
@@ -8479,10 +8699,10 @@ import { Popover } from &#39;@agentero/design-system/popover&#39;;
8479
8699
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
8480
8700
 
8481
8701
 
8482
- <input id="c-24-components-popover-stories" class="tg tg-stories" type="checkbox" hidden />
8702
+ <input id="c-25-components-popover-stories" class="tg tg-stories" type="checkbox" hidden />
8483
8703
 
8484
8704
 
8485
- <input id="c-24-components-popover-props" class="tg tg-props" type="checkbox" hidden />
8705
+ <input id="c-25-components-popover-props" class="tg tg-props" type="checkbox" hidden />
8486
8706
 
8487
8707
  <div class="panels">
8488
8708
 
@@ -8681,9 +8901,9 @@ focus returning to its trigger once the modal closes.</div>
8681
8901
  <div class="title">
8682
8902
  <h2><span class="status-dot dot-ok"></span> Progress</h2>
8683
8903
  <div class="badges">
8684
- <label for="c-25-components-progress-props" class="badge ok as-toggle">4 prop types</label>
8904
+ <label for="c-26-components-progress-props" class="badge ok as-toggle">4 prop types</label>
8685
8905
 
8686
- <label for="c-25-components-progress-stories" class="badge ok as-toggle">4 stories</label>
8906
+ <label for="c-26-components-progress-stories" class="badge ok as-toggle">4 stories</label>
8687
8907
 
8688
8908
 
8689
8909
  </div>
@@ -8702,10 +8922,10 @@ with `currentColor`, so recolor it with a plain text class — e.g.
8702
8922
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
8703
8923
 
8704
8924
 
8705
- <input id="c-25-components-progress-stories" class="tg tg-stories" type="checkbox" hidden />
8925
+ <input id="c-26-components-progress-stories" class="tg tg-stories" type="checkbox" hidden />
8706
8926
 
8707
8927
 
8708
- <input id="c-25-components-progress-props" class="tg tg-props" type="checkbox" hidden />
8928
+ <input id="c-26-components-progress-props" class="tg tg-props" type="checkbox" hidden />
8709
8929
 
8710
8930
  <div class="panels">
8711
8931
 
@@ -8824,7 +9044,7 @@ percentage: number</code></pre>
8824
9044
  <div class="badges">
8825
9045
 
8826
9046
 
8827
- <label for="c-26-components-skeleton-stories" class="badge ok as-toggle">4 stories</label>
9047
+ <label for="c-27-components-skeleton-stories" class="badge ok as-toggle">4 stories</label>
8828
9048
 
8829
9049
 
8830
9050
  </div>
@@ -8841,7 +9061,7 @@ shape it with Tailwind classes to mirror the content it stands in for.</div>
8841
9061
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
8842
9062
 
8843
9063
 
8844
- <input id="c-26-components-skeleton-stories" class="tg tg-stories" type="checkbox" hidden />
9064
+ <input id="c-27-components-skeleton-stories" class="tg tg-stories" type="checkbox" hidden />
8845
9065
 
8846
9066
 
8847
9067
 
@@ -8937,9 +9157,9 @@ shape it with Tailwind classes to mirror the content it stands in for.</div>
8937
9157
  <div class="title">
8938
9158
  <h2><span class="status-dot dot-ok"></span> Switch</h2>
8939
9159
  <div class="badges">
8940
- <label for="c-27-components-switch-props" class="badge ok as-toggle">8 prop types</label>
9160
+ <label for="c-28-components-switch-props" class="badge ok as-toggle">8 prop types</label>
8941
9161
 
8942
- <label for="c-27-components-switch-stories" class="badge ok as-toggle">7 stories</label>
9162
+ <label for="c-28-components-switch-stories" class="badge ok as-toggle">7 stories</label>
8943
9163
 
8944
9164
 
8945
9165
  </div>
@@ -8955,10 +9175,10 @@ a Checkbox for a single boolean that applies instantly, and pair it with a
8955
9175
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
8956
9176
 
8957
9177
 
8958
- <input id="c-27-components-switch-stories" class="tg tg-stories" type="checkbox" hidden />
9178
+ <input id="c-28-components-switch-stories" class="tg tg-stories" type="checkbox" hidden />
8959
9179
 
8960
9180
 
8961
- <input id="c-27-components-switch-props" class="tg tg-props" type="checkbox" hidden />
9181
+ <input id="c-28-components-switch-props" class="tg tg-props" type="checkbox" hidden />
8962
9182
 
8963
9183
  <div class="panels">
8964
9184
 
@@ -9139,9 +9359,9 @@ size?: &quot;sm&quot; | &quot;md&quot;</code></pre>
9139
9359
  <div class="title">
9140
9360
  <h2><span class="status-dot dot-ok"></span> Table.Root</h2>
9141
9361
  <div class="badges">
9142
- <label for="c-28-components-table-props" class="badge ok as-toggle">6 prop types</label>
9362
+ <label for="c-29-components-table-props" class="badge ok as-toggle">6 prop types</label>
9143
9363
 
9144
- <label for="c-28-components-table-stories" class="badge ok as-toggle">10 stories</label>
9364
+ <label for="c-29-components-table-stories" class="badge ok as-toggle">10 stories</label>
9145
9365
 
9146
9366
 
9147
9367
  </div>
@@ -9172,10 +9392,10 @@ import { Table } from &#39;@agentero/design-system/table&#39;;
9172
9392
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
9173
9393
 
9174
9394
 
9175
- <input id="c-28-components-table-stories" class="tg tg-stories" type="checkbox" hidden />
9395
+ <input id="c-29-components-table-stories" class="tg tg-stories" type="checkbox" hidden />
9176
9396
 
9177
9397
 
9178
- <input id="c-28-components-table-props" class="tg tg-props" type="checkbox" hidden />
9398
+ <input id="c-29-components-table-props" class="tg tg-props" type="checkbox" hidden />
9179
9399
 
9180
9400
  <div class="panels">
9181
9401
 
@@ -9393,9 +9613,9 @@ keeps its padding.</div>
9393
9613
  <div class="title">
9394
9614
  <h2><span class="status-dot dot-ok"></span> Tabs.Root</h2>
9395
9615
  <div class="badges">
9396
- <label for="c-29-components-tabs-props" class="badge ok as-toggle">9 prop types</label>
9616
+ <label for="c-30-components-tabs-props" class="badge ok as-toggle">9 prop types</label>
9397
9617
 
9398
- <label for="c-29-components-tabs-stories" class="badge ok as-toggle">8 stories</label>
9618
+ <label for="c-30-components-tabs-stories" class="badge ok as-toggle">8 stories</label>
9399
9619
 
9400
9620
 
9401
9621
  </div>
@@ -9426,10 +9646,10 @@ import { Tabs } from &#39;@agentero/design-system/tabs&#39;;
9426
9646
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
9427
9647
 
9428
9648
 
9429
- <input id="c-29-components-tabs-stories" class="tg tg-stories" type="checkbox" hidden />
9649
+ <input id="c-30-components-tabs-stories" class="tg tg-stories" type="checkbox" hidden />
9430
9650
 
9431
9651
 
9432
- <input id="c-29-components-tabs-props" class="tg tg-props" type="checkbox" hidden />
9652
+ <input id="c-30-components-tabs-props" class="tg tg-props" type="checkbox" hidden />
9433
9653
 
9434
9654
  <div class="panels">
9435
9655
 
@@ -9650,9 +9870,9 @@ tablist role is announced.</div>
9650
9870
  <div class="title">
9651
9871
  <h2><span class="status-dot dot-ok"></span> Tag</h2>
9652
9872
  <div class="badges">
9653
- <label for="c-30-components-tag-props" class="badge ok as-toggle">8 prop types</label>
9873
+ <label for="c-31-components-tag-props" class="badge ok as-toggle">8 prop types</label>
9654
9874
 
9655
- <label for="c-30-components-tag-stories" class="badge ok as-toggle">12 stories</label>
9875
+ <label for="c-31-components-tag-stories" class="badge ok as-toggle">12 stories</label>
9656
9876
 
9657
9877
 
9658
9878
  </div>
@@ -9671,10 +9891,10 @@ it an interactive link or button, which adds the pointer cursor and hover fill.<
9671
9891
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
9672
9892
 
9673
9893
 
9674
- <input id="c-30-components-tag-stories" class="tg tg-stories" type="checkbox" hidden />
9894
+ <input id="c-31-components-tag-stories" class="tg tg-stories" type="checkbox" hidden />
9675
9895
 
9676
9896
 
9677
- <input id="c-30-components-tag-props" class="tg tg-props" type="checkbox" hidden />
9897
+ <input id="c-31-components-tag-props" class="tg tg-props" type="checkbox" hidden />
9678
9898
 
9679
9899
  <div class="panels">
9680
9900
 
@@ -10099,9 +10319,9 @@ leading + trailing icons, and icon-only.</div>
10099
10319
  <div class="title">
10100
10320
  <h2><span class="status-dot dot-ok"></span> TextArea</h2>
10101
10321
  <div class="badges">
10102
- <label for="c-31-components-textarea-props" class="badge ok as-toggle">1 prop type</label>
10322
+ <label for="c-32-components-textarea-props" class="badge ok as-toggle">1 prop type</label>
10103
10323
 
10104
- <label for="c-31-components-textarea-stories" class="badge ok as-toggle">6 stories</label>
10324
+ <label for="c-32-components-textarea-stories" class="badge ok as-toggle">6 stories</label>
10105
10325
 
10106
10326
 
10107
10327
  </div>
@@ -10118,10 +10338,10 @@ states. It wires nothing on its own: `id`, `aria-invalid` and
10118
10338
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
10119
10339
 
10120
10340
 
10121
- <input id="c-31-components-textarea-stories" class="tg tg-stories" type="checkbox" hidden />
10341
+ <input id="c-32-components-textarea-stories" class="tg tg-stories" type="checkbox" hidden />
10122
10342
 
10123
10343
 
10124
- <input id="c-31-components-textarea-props" class="tg tg-props" type="checkbox" hidden />
10344
+ <input id="c-32-components-textarea-props" class="tg tg-props" type="checkbox" hidden />
10125
10345
 
10126
10346
  <div class="panels">
10127
10347
 
@@ -10253,9 +10473,9 @@ size and the minimum height shows three rows.</div>
10253
10473
  <div class="title">
10254
10474
  <h2><span class="status-dot dot-ok"></span> Toast</h2>
10255
10475
  <div class="badges">
10256
- <label for="c-32-components-toast-props" class="badge ok as-toggle">11 prop types</label>
10476
+ <label for="c-33-components-toast-props" class="badge ok as-toggle">11 prop types</label>
10257
10477
 
10258
- <label for="c-32-components-toast-stories" class="badge ok as-toggle">11 stories</label>
10478
+ <label for="c-33-components-toast-stories" class="badge ok as-toggle">11 stories</label>
10259
10479
 
10260
10480
 
10261
10481
  </div>
@@ -10274,10 +10494,10 @@ common feedback patterns.</div>
10274
10494
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
10275
10495
 
10276
10496
 
10277
- <input id="c-32-components-toast-stories" class="tg tg-stories" type="checkbox" hidden />
10497
+ <input id="c-33-components-toast-stories" class="tg tg-stories" type="checkbox" hidden />
10278
10498
 
10279
10499
 
10280
- <input id="c-32-components-toast-props" class="tg tg-props" type="checkbox" hidden />
10500
+ <input id="c-33-components-toast-props" class="tg tg-props" type="checkbox" hidden />
10281
10501
 
10282
10502
  <div class="panels">
10283
10503
 
@@ -10706,9 +10926,9 @@ action (e.g., a sync icon for a sync-in-progress toast).</div>
10706
10926
  <div class="title">
10707
10927
  <h2><span class="status-dot dot-ok"></span> Tooltip</h2>
10708
10928
  <div class="badges">
10709
- <label for="c-33-components-tooltip-props" class="badge ok as-toggle">12 prop types</label>
10929
+ <label for="c-34-components-tooltip-props" class="badge ok as-toggle">12 prop types</label>
10710
10930
 
10711
- <label for="c-33-components-tooltip-stories" class="badge ok as-toggle">5 stories</label>
10931
+ <label for="c-34-components-tooltip-stories" class="badge ok as-toggle">5 stories</label>
10712
10932
 
10713
10933
 
10714
10934
  </div>
@@ -10727,10 +10947,10 @@ on hover or focus.</div>
10727
10947
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
10728
10948
 
10729
10949
 
10730
- <input id="c-33-components-tooltip-stories" class="tg tg-stories" type="checkbox" hidden />
10950
+ <input id="c-34-components-tooltip-stories" class="tg tg-stories" type="checkbox" hidden />
10731
10951
 
10732
10952
 
10733
- <input id="c-33-components-tooltip-props" class="tg tg-props" type="checkbox" hidden />
10953
+ <input id="c-34-components-tooltip-props" class="tg tg-props" type="checkbox" hidden />
10734
10954
 
10735
10955
  <div class="panels">
10736
10956
 
@@ -10902,9 +11122,9 @@ sideOffset?: number = 4</code></pre>
10902
11122
  <div class="title">
10903
11123
  <h2><span class="status-dot dot-ok"></span> ValidationList</h2>
10904
11124
  <div class="badges">
10905
- <label for="c-34-components-validationlist-props" class="badge ok as-toggle">2 prop types</label>
11125
+ <label for="c-35-components-validationlist-props" class="badge ok as-toggle">2 prop types</label>
10906
11126
 
10907
- <label for="c-34-components-validationlist-stories" class="badge ok as-toggle">4 stories</label>
11127
+ <label for="c-35-components-validationlist-stories" class="badge ok as-toggle">4 stories</label>
10908
11128
 
10909
11129
 
10910
11130
  </div>
@@ -10925,10 +11145,10 @@ your form validation; it does not own the input or block submission.</div>
10925
11145
  <!-- ⬇️ Hidden toggles must be siblings BEFORE .panels -->
10926
11146
 
10927
11147
 
10928
- <input id="c-34-components-validationlist-stories" class="tg tg-stories" type="checkbox" hidden />
11148
+ <input id="c-35-components-validationlist-stories" class="tg tg-stories" type="checkbox" hidden />
10929
11149
 
10930
11150
 
10931
- <input id="c-34-components-validationlist-props" class="tg tg-props" type="checkbox" hidden />
11151
+ <input id="c-35-components-validationlist-props" class="tg tg-props" type="checkbox" hidden />
10932
11152
 
10933
11153
  <div class="panels">
10934
11154