feat(webkit): give chip three kinds and hand presence to the consumer - #883

Merged
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds
Aug 14, 2026
Merged

feat(webkit): give chip three kinds and hand presence to the consumer#883
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds

Conversation

@gabriel-lisboa-azion

Copy link
Copy Markdown
Collaborator

What

Chip gains a kind axis covering the three jobs it actually does in a filter surface, so a consumer never has to restyle the component to get one of them:

kindJobTreatment
filled (default)a value that is appliedraised surface, border, shadow — the loudest, because it is state
outlineda value the user could applysame border, no fill, no shadow — recedes to an offer without becoming disabled
dashedthe control that creates a chipdashed outline, the standing "add another one of these" convention

The breaking part: presence is the consumer's

remove used to fade the chip to opacity: 0 and only then emit, so the chip decided its own disappearance. That could serve exactly one case — where removing a value also destroys the chip. A filter bar where a removed value stays on screen as an outlined offer was impossible: the instance stayed invisible forever.

remove now fires immediately and the chip stays mounted. Exit motion, where wanted, belongs to whatever owns the list — so table-applied-filters gains the TransitionGroup that actually destroys chips. That is why it ships in this PR: split apart, one half double-animates removal and the other un-animates it.

The inline style="transition: …" the old fade needed is gone too — an inline transition beats every transition-* class a consumer puts on the same element (see #881).

Also

  • The remove control is named after what it removes: aria-label="Remove Production", with a Tooltip carrying the same string, and a 24×24 target at medium (WCAG 2.5.8). A row of chips whose every button says "Remove" is unusable by voice or screen reader.
  • Enter/Space dispatch a real DOM click, so a Chip works as a Popover.Trigger / Dropdown.Trigger child from the keyboard.
  • Both sizes are now fixed heights (24px / 32px) rather than padding-driven, so a row of chips shares one baseline.
  • Adds the missing .size-limit.json row — chip now carries Tooltip, and nothing was measuring that. 4.27 KB gzipped against a 5 KB budget.

BREAKING CHANGE

  • remove no longer waits for a fade before emitting, and the chip no longer unmounts itself. A consumer relying on self-dismissal must now drop the chip from its own collection.
  • small is a fixed 24px (was 20px) and medium a fixed 32px (was ~30px from padding); medium uses text-label-sm.

Verification

33 chip tests pass, including the two that pin the new contract — "stays mounted after remove" and "declares no inline transition on the root". Catalog regenerated on this branch (not carried), so catalog:check is clean.

Adds kind: filled | outlined | dashed, fixes the two sizes at 24/32px, and
names the remove control after what it removes ("Remove $label") with a
tooltip carrying the same string and a 24x24 target.
The remove event now fires immediately and the chip stays mounted, so a
chip can survive its own removal (a filter chip that empties but remains).
The exit motion moves to table-applied-filters, which owns the
TransitionGroup that actually destroys chips.
Enter/Space now dispatch a real DOM click so a Chip works as a
Popover.Trigger child from the keyboard.
BREAKING CHANGE: remove no longer waits for a fade before emitting, and the
chip no longer unmounts itself — the consumer owns presence. Both sizes
changed to fixed heights (24px small, 32px medium) and medium now uses
text-label-sm.
Naming the remove control after what it removes brought Tooltip in as a
dependency, and chip had no size-limit row to catch that. It measures 4.27 KB
gzipped; the budget is 5 KB.
The Motion table named tooltip's animate-popup-scale-in/out utilities, and
the authoring ratchet reads that table per FILE — so it required classes in
chip.vue that belong to the component chip composes. The row now names the
owner and points at its spec instead of quoting its utilities, which is the
truer statement anyway: those tokens and their reduced-motion fallback are
tooltip's contract.
The chip's appearance changed on purpose — fixed 24/32px heights instead of
padding-driven, a pill radius, and text-label-sm at medium — so all six modes
diverged by 1.6-2.9%. Adds the snapshots for the new Types and Clickable
stories.
`filled` specified `bg-(--bg-surface-raised )` — with a stray space inside the
paren shorthand. The space terminates the Tailwind candidate, so the utility
compiled to no CSS at all and every `filled` chip has been fully transparent in
both themes, distinguishable from an `outlined` one only by its shadow.
The token would not have carried the distinction anyway: `--bg-surface-raised`
resolves to the same value as `--bg-surface` in the light theme, so the
applied/available contrast it was meant to express existed in dark only.
So all three kinds now share one fill (`--bg-surface`) and one border
(`--border-default`), per Figma, and differ only in elevation — `filled` keeps
`--shadow-sm`, which is the job it was already doing alone. The remove glyph
drops to `--text-muted` at rest and rises to `--text-default` on hover: at rest
it is punctuation after a label, on hover it is what is being aimed at.
Measured in Chromium against the Figma frames, both themes: fill #0a0a0a,
border #ffffff1a, 32px tall, 12px sides (4px trailing when removable), 24px
remove control.
# Conflicts:
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-tablet.png
@robson-junior-azionrobson-junior-azion changed the title feat(webkit)!: give chip three kinds and hand presence to the consumerfeat(webkit): give chip three kinds and hand presence to the consumerAug 14, 2026
robson-junior-azion
robson-junior-azion previously approved these changes Aug 14, 2026
@isaque-bock-azion
isaque-bock-azion merged commit 250fd62 into mainAug 14, 2026
23 checks passed
@isaque-bock-azion
isaque-bock-azion deleted the feat/chip-kinds branch August 14, 2026 21:17
gabriel-lisboa-azion added a commit that referenced this pull request Aug 17, 2026
Brings the three commits demo lacked, so the deployed sample exercises them
alongside the four fixes carved out of this branch (#899#902), whose content was
already here:
- feat(webkit): chip's three kinds (#883)
- feat(theme): the semantic/layouts container system (#884)
- feat(theme): lightened heading and body type (#876)
Conflict resolutions worth knowing:
`build-tokens.mjs` — main has no illustration tokens, so main's side of all six
hunks was empty. Taking it would have silently deleted this branch's illustration
wiring; ours was kept. The merge then produced a DUPLICATE `emitUtilities` and
`emitLayoutUtilities` with no conflict at all (both sides had added an identical
helper in different places), which is a syntax error the merge itself reported as
clean — the second copy is removed and `emitIllustrationUtilities` reuses the
first.
`texts.data.js` — the five conflicts were all `text-body-*` weight, resolved to
main's `light` since that is the change being previewed. Resolved in place rather
than with `--theirs`, which would have discarded the file's auto-merged hunks.
Entry count held at 144.
`.size-limit.json` — union, not a side: main's `chip` plus this branch's
`footer-root` and `resizable-panel-root`.
`dist/v4/globals.*` are generated, so they were rebuilt from the merged sources
rather than hand-merged. The 466 conflicting visual baselines took main's copies;
neither side is valid for a merged tree, and this branch opens no PR the visual
gate guards.
Verified after: no `undefined` in the built CSS, illustration tokens still emitted,
main's layout utilities present, body weights now 300, no token data file lost
entries, and 154 tests pass across toast, table, sidebar, resizable-panel and chip.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@gabriel-lisboa-azion@herbert-julio-azion@robson-junior-azion@isaque-bock-azion
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(webkit): give chip three kinds and hand presence to the consumer - #883

Merged
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds
Aug 14, 2026
Merged

feat(webkit): give chip three kinds and hand presence to the consumer#883
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds

Conversation

@gabriel-lisboa-azion

Copy link
Copy Markdown
Collaborator

What

Chip gains a kind axis covering the three jobs it actually does in a filter surface, so a consumer never has to restyle the component to get one of them:

kindJobTreatment
filled (default)a value that is appliedraised surface, border, shadow — the loudest, because it is state
outlineda value the user could applysame border, no fill, no shadow — recedes to an offer without becoming disabled
dashedthe control that creates a chipdashed outline, the standing "add another one of these" convention

The breaking part: presence is the consumer's

remove used to fade the chip to opacity: 0 and only then emit, so the chip decided its own disappearance. That could serve exactly one case — where removing a value also destroys the chip. A filter bar where a removed value stays on screen as an outlined offer was impossible: the instance stayed invisible forever.

remove now fires immediately and the chip stays mounted. Exit motion, where wanted, belongs to whatever owns the list — so table-applied-filters gains the TransitionGroup that actually destroys chips. That is why it ships in this PR: split apart, one half double-animates removal and the other un-animates it.

The inline style="transition: …" the old fade needed is gone too — an inline transition beats every transition-* class a consumer puts on the same element (see #881).

Also

  • The remove control is named after what it removes: aria-label="Remove Production", with a Tooltip carrying the same string, and a 24×24 target at medium (WCAG 2.5.8). A row of chips whose every button says "Remove" is unusable by voice or screen reader.
  • Enter/Space dispatch a real DOM click, so a Chip works as a Popover.Trigger / Dropdown.Trigger child from the keyboard.
  • Both sizes are now fixed heights (24px / 32px) rather than padding-driven, so a row of chips shares one baseline.
  • Adds the missing .size-limit.json row — chip now carries Tooltip, and nothing was measuring that. 4.27 KB gzipped against a 5 KB budget.

BREAKING CHANGE

  • remove no longer waits for a fade before emitting, and the chip no longer unmounts itself. A consumer relying on self-dismissal must now drop the chip from its own collection.
  • small is a fixed 24px (was 20px) and medium a fixed 32px (was ~30px from padding); medium uses text-label-sm.

Verification

33 chip tests pass, including the two that pin the new contract — "stays mounted after remove" and "declares no inline transition on the root". Catalog regenerated on this branch (not carried), so catalog:check is clean.

Adds kind: filled | outlined | dashed, fixes the two sizes at 24/32px, and
names the remove control after what it removes ("Remove $label") with a
tooltip carrying the same string and a 24x24 target.
The remove event now fires immediately and the chip stays mounted, so a
chip can survive its own removal (a filter chip that empties but remains).
The exit motion moves to table-applied-filters, which owns the
TransitionGroup that actually destroys chips.
Enter/Space now dispatch a real DOM click so a Chip works as a
Popover.Trigger child from the keyboard.
BREAKING CHANGE: remove no longer waits for a fade before emitting, and the
chip no longer unmounts itself — the consumer owns presence. Both sizes
changed to fixed heights (24px small, 32px medium) and medium now uses
text-label-sm.
Naming the remove control after what it removes brought Tooltip in as a
dependency, and chip had no size-limit row to catch that. It measures 4.27 KB
gzipped; the budget is 5 KB.
The Motion table named tooltip's animate-popup-scale-in/out utilities, and
the authoring ratchet reads that table per FILE — so it required classes in
chip.vue that belong to the component chip composes. The row now names the
owner and points at its spec instead of quoting its utilities, which is the
truer statement anyway: those tokens and their reduced-motion fallback are
tooltip's contract.
The chip's appearance changed on purpose — fixed 24/32px heights instead of
padding-driven, a pill radius, and text-label-sm at medium — so all six modes
diverged by 1.6-2.9%. Adds the snapshots for the new Types and Clickable
stories.
`filled` specified `bg-(--bg-surface-raised )` — with a stray space inside the
paren shorthand. The space terminates the Tailwind candidate, so the utility
compiled to no CSS at all and every `filled` chip has been fully transparent in
both themes, distinguishable from an `outlined` one only by its shadow.
The token would not have carried the distinction anyway: `--bg-surface-raised`
resolves to the same value as `--bg-surface` in the light theme, so the
applied/available contrast it was meant to express existed in dark only.
So all three kinds now share one fill (`--bg-surface`) and one border
(`--border-default`), per Figma, and differ only in elevation — `filled` keeps
`--shadow-sm`, which is the job it was already doing alone. The remove glyph
drops to `--text-muted` at rest and rises to `--text-default` on hover: at rest
it is punctuation after a label, on hover it is what is being aimed at.
Measured in Chromium against the Figma frames, both themes: fill #0a0a0a,
border #ffffff1a, 32px tall, 12px sides (4px trailing when removable), 24px
remove control.
# Conflicts:
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-tablet.png
@robson-junior-azionrobson-junior-azion changed the title feat(webkit)!: give chip three kinds and hand presence to the consumerfeat(webkit): give chip three kinds and hand presence to the consumerAug 14, 2026
robson-junior-azion
robson-junior-azion previously approved these changes Aug 14, 2026
@isaque-bock-azion
isaque-bock-azion merged commit 250fd62 into mainAug 14, 2026
23 checks passed
@isaque-bock-azion
isaque-bock-azion deleted the feat/chip-kinds branch August 14, 2026 21:17
gabriel-lisboa-azion added a commit that referenced this pull request Aug 17, 2026
Brings the three commits demo lacked, so the deployed sample exercises them
alongside the four fixes carved out of this branch (#899#902), whose content was
already here:
- feat(webkit): chip's three kinds (#883)
- feat(theme): the semantic/layouts container system (#884)
- feat(theme): lightened heading and body type (#876)
Conflict resolutions worth knowing:
`build-tokens.mjs` — main has no illustration tokens, so main's side of all six
hunks was empty. Taking it would have silently deleted this branch's illustration
wiring; ours was kept. The merge then produced a DUPLICATE `emitUtilities` and
`emitLayoutUtilities` with no conflict at all (both sides had added an identical
helper in different places), which is a syntax error the merge itself reported as
clean — the second copy is removed and `emitIllustrationUtilities` reuses the
first.
`texts.data.js` — the five conflicts were all `text-body-*` weight, resolved to
main's `light` since that is the change being previewed. Resolved in place rather
than with `--theirs`, which would have discarded the file's auto-merged hunks.
Entry count held at 144.
`.size-limit.json` — union, not a side: main's `chip` plus this branch's
`footer-root` and `resizable-panel-root`.
`dist/v4/globals.*` are generated, so they were rebuilt from the merged sources
rather than hand-merged. The 466 conflicting visual baselines took main's copies;
neither side is valid for a merged tree, and this branch opens no PR the visual
gate guards.
Verified after: no `undefined` in the built CSS, illustration tokens still emitted,
main's layout utilities present, body weights now 300, no token data file lost
entries, and 154 tests pass across toast, table, sidebar, resizable-panel and chip.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@gabriel-lisboa-azion@herbert-julio-azion@robson-junior-azion@isaque-bock-azion
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(webkit): give chip three kinds and hand presence to the consumer - #883

Merged
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds
Aug 14, 2026
Merged

feat(webkit): give chip three kinds and hand presence to the consumer#883
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds

Conversation

@gabriel-lisboa-azion

Copy link
Copy Markdown
Collaborator

What

Chip gains a kind axis covering the three jobs it actually does in a filter surface, so a consumer never has to restyle the component to get one of them:

kindJobTreatment
filled (default)a value that is appliedraised surface, border, shadow — the loudest, because it is state
outlineda value the user could applysame border, no fill, no shadow — recedes to an offer without becoming disabled
dashedthe control that creates a chipdashed outline, the standing "add another one of these" convention

The breaking part: presence is the consumer's

remove used to fade the chip to opacity: 0 and only then emit, so the chip decided its own disappearance. That could serve exactly one case — where removing a value also destroys the chip. A filter bar where a removed value stays on screen as an outlined offer was impossible: the instance stayed invisible forever.

remove now fires immediately and the chip stays mounted. Exit motion, where wanted, belongs to whatever owns the list — so table-applied-filters gains the TransitionGroup that actually destroys chips. That is why it ships in this PR: split apart, one half double-animates removal and the other un-animates it.

The inline style="transition: …" the old fade needed is gone too — an inline transition beats every transition-* class a consumer puts on the same element (see #881).

Also

  • The remove control is named after what it removes: aria-label="Remove Production", with a Tooltip carrying the same string, and a 24×24 target at medium (WCAG 2.5.8). A row of chips whose every button says "Remove" is unusable by voice or screen reader.
  • Enter/Space dispatch a real DOM click, so a Chip works as a Popover.Trigger / Dropdown.Trigger child from the keyboard.
  • Both sizes are now fixed heights (24px / 32px) rather than padding-driven, so a row of chips shares one baseline.
  • Adds the missing .size-limit.json row — chip now carries Tooltip, and nothing was measuring that. 4.27 KB gzipped against a 5 KB budget.

BREAKING CHANGE

  • remove no longer waits for a fade before emitting, and the chip no longer unmounts itself. A consumer relying on self-dismissal must now drop the chip from its own collection.
  • small is a fixed 24px (was 20px) and medium a fixed 32px (was ~30px from padding); medium uses text-label-sm.

Verification

33 chip tests pass, including the two that pin the new contract — "stays mounted after remove" and "declares no inline transition on the root". Catalog regenerated on this branch (not carried), so catalog:check is clean.

Adds kind: filled | outlined | dashed, fixes the two sizes at 24/32px, and
names the remove control after what it removes ("Remove $label") with a
tooltip carrying the same string and a 24x24 target.
The remove event now fires immediately and the chip stays mounted, so a
chip can survive its own removal (a filter chip that empties but remains).
The exit motion moves to table-applied-filters, which owns the
TransitionGroup that actually destroys chips.
Enter/Space now dispatch a real DOM click so a Chip works as a
Popover.Trigger child from the keyboard.
BREAKING CHANGE: remove no longer waits for a fade before emitting, and the
chip no longer unmounts itself — the consumer owns presence. Both sizes
changed to fixed heights (24px small, 32px medium) and medium now uses
text-label-sm.
Naming the remove control after what it removes brought Tooltip in as a
dependency, and chip had no size-limit row to catch that. It measures 4.27 KB
gzipped; the budget is 5 KB.
The Motion table named tooltip's animate-popup-scale-in/out utilities, and
the authoring ratchet reads that table per FILE — so it required classes in
chip.vue that belong to the component chip composes. The row now names the
owner and points at its spec instead of quoting its utilities, which is the
truer statement anyway: those tokens and their reduced-motion fallback are
tooltip's contract.
The chip's appearance changed on purpose — fixed 24/32px heights instead of
padding-driven, a pill radius, and text-label-sm at medium — so all six modes
diverged by 1.6-2.9%. Adds the snapshots for the new Types and Clickable
stories.
`filled` specified `bg-(--bg-surface-raised )` — with a stray space inside the
paren shorthand. The space terminates the Tailwind candidate, so the utility
compiled to no CSS at all and every `filled` chip has been fully transparent in
both themes, distinguishable from an `outlined` one only by its shadow.
The token would not have carried the distinction anyway: `--bg-surface-raised`
resolves to the same value as `--bg-surface` in the light theme, so the
applied/available contrast it was meant to express existed in dark only.
So all three kinds now share one fill (`--bg-surface`) and one border
(`--border-default`), per Figma, and differ only in elevation — `filled` keeps
`--shadow-sm`, which is the job it was already doing alone. The remove glyph
drops to `--text-muted` at rest and rises to `--text-default` on hover: at rest
it is punctuation after a label, on hover it is what is being aimed at.
Measured in Chromium against the Figma frames, both themes: fill #0a0a0a,
border #ffffff1a, 32px tall, 12px sides (4px trailing when removable), 24px
remove control.
# Conflicts:
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-tablet.png
@robson-junior-azionrobson-junior-azion changed the title feat(webkit)!: give chip three kinds and hand presence to the consumerfeat(webkit): give chip three kinds and hand presence to the consumerAug 14, 2026
robson-junior-azion
robson-junior-azion previously approved these changes Aug 14, 2026
@isaque-bock-azion
isaque-bock-azion merged commit 250fd62 into mainAug 14, 2026
23 checks passed
@isaque-bock-azion
isaque-bock-azion deleted the feat/chip-kinds branch August 14, 2026 21:17
gabriel-lisboa-azion added a commit that referenced this pull request Aug 17, 2026
Brings the three commits demo lacked, so the deployed sample exercises them
alongside the four fixes carved out of this branch (#899#902), whose content was
already here:
- feat(webkit): chip's three kinds (#883)
- feat(theme): the semantic/layouts container system (#884)
- feat(theme): lightened heading and body type (#876)
Conflict resolutions worth knowing:
`build-tokens.mjs` — main has no illustration tokens, so main's side of all six
hunks was empty. Taking it would have silently deleted this branch's illustration
wiring; ours was kept. The merge then produced a DUPLICATE `emitUtilities` and
`emitLayoutUtilities` with no conflict at all (both sides had added an identical
helper in different places), which is a syntax error the merge itself reported as
clean — the second copy is removed and `emitIllustrationUtilities` reuses the
first.
`texts.data.js` — the five conflicts were all `text-body-*` weight, resolved to
main's `light` since that is the change being previewed. Resolved in place rather
than with `--theirs`, which would have discarded the file's auto-merged hunks.
Entry count held at 144.
`.size-limit.json` — union, not a side: main's `chip` plus this branch's
`footer-root` and `resizable-panel-root`.
`dist/v4/globals.*` are generated, so they were rebuilt from the merged sources
rather than hand-merged. The 466 conflicting visual baselines took main's copies;
neither side is valid for a merged tree, and this branch opens no PR the visual
gate guards.
Verified after: no `undefined` in the built CSS, illustration tokens still emitted,
main's layout utilities present, body weights now 300, no token data file lost
entries, and 154 tests pass across toast, table, sidebar, resizable-panel and chip.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@gabriel-lisboa-azion@herbert-julio-azion@robson-junior-azion@isaque-bock-azion
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(webkit): give chip three kinds and hand presence to the consumer - #883

Merged
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds
Aug 14, 2026
Merged

feat(webkit): give chip three kinds and hand presence to the consumer#883
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds

Conversation

@gabriel-lisboa-azion

Copy link
Copy Markdown
Collaborator

What

Chip gains a kind axis covering the three jobs it actually does in a filter surface, so a consumer never has to restyle the component to get one of them:

kindJobTreatment
filled (default)a value that is appliedraised surface, border, shadow — the loudest, because it is state
outlineda value the user could applysame border, no fill, no shadow — recedes to an offer without becoming disabled
dashedthe control that creates a chipdashed outline, the standing "add another one of these" convention

The breaking part: presence is the consumer's

remove used to fade the chip to opacity: 0 and only then emit, so the chip decided its own disappearance. That could serve exactly one case — where removing a value also destroys the chip. A filter bar where a removed value stays on screen as an outlined offer was impossible: the instance stayed invisible forever.

remove now fires immediately and the chip stays mounted. Exit motion, where wanted, belongs to whatever owns the list — so table-applied-filters gains the TransitionGroup that actually destroys chips. That is why it ships in this PR: split apart, one half double-animates removal and the other un-animates it.

The inline style="transition: …" the old fade needed is gone too — an inline transition beats every transition-* class a consumer puts on the same element (see #881).

Also

  • The remove control is named after what it removes: aria-label="Remove Production", with a Tooltip carrying the same string, and a 24×24 target at medium (WCAG 2.5.8). A row of chips whose every button says "Remove" is unusable by voice or screen reader.
  • Enter/Space dispatch a real DOM click, so a Chip works as a Popover.Trigger / Dropdown.Trigger child from the keyboard.
  • Both sizes are now fixed heights (24px / 32px) rather than padding-driven, so a row of chips shares one baseline.
  • Adds the missing .size-limit.json row — chip now carries Tooltip, and nothing was measuring that. 4.27 KB gzipped against a 5 KB budget.

BREAKING CHANGE

  • remove no longer waits for a fade before emitting, and the chip no longer unmounts itself. A consumer relying on self-dismissal must now drop the chip from its own collection.
  • small is a fixed 24px (was 20px) and medium a fixed 32px (was ~30px from padding); medium uses text-label-sm.

Verification

33 chip tests pass, including the two that pin the new contract — "stays mounted after remove" and "declares no inline transition on the root". Catalog regenerated on this branch (not carried), so catalog:check is clean.

Adds kind: filled | outlined | dashed, fixes the two sizes at 24/32px, and
names the remove control after what it removes ("Remove $label") with a
tooltip carrying the same string and a 24x24 target.
The remove event now fires immediately and the chip stays mounted, so a
chip can survive its own removal (a filter chip that empties but remains).
The exit motion moves to table-applied-filters, which owns the
TransitionGroup that actually destroys chips.
Enter/Space now dispatch a real DOM click so a Chip works as a
Popover.Trigger child from the keyboard.
BREAKING CHANGE: remove no longer waits for a fade before emitting, and the
chip no longer unmounts itself — the consumer owns presence. Both sizes
changed to fixed heights (24px small, 32px medium) and medium now uses
text-label-sm.
Naming the remove control after what it removes brought Tooltip in as a
dependency, and chip had no size-limit row to catch that. It measures 4.27 KB
gzipped; the budget is 5 KB.
The Motion table named tooltip's animate-popup-scale-in/out utilities, and
the authoring ratchet reads that table per FILE — so it required classes in
chip.vue that belong to the component chip composes. The row now names the
owner and points at its spec instead of quoting its utilities, which is the
truer statement anyway: those tokens and their reduced-motion fallback are
tooltip's contract.
The chip's appearance changed on purpose — fixed 24/32px heights instead of
padding-driven, a pill radius, and text-label-sm at medium — so all six modes
diverged by 1.6-2.9%. Adds the snapshots for the new Types and Clickable
stories.
`filled` specified `bg-(--bg-surface-raised )` — with a stray space inside the
paren shorthand. The space terminates the Tailwind candidate, so the utility
compiled to no CSS at all and every `filled` chip has been fully transparent in
both themes, distinguishable from an `outlined` one only by its shadow.
The token would not have carried the distinction anyway: `--bg-surface-raised`
resolves to the same value as `--bg-surface` in the light theme, so the
applied/available contrast it was meant to express existed in dark only.
So all three kinds now share one fill (`--bg-surface`) and one border
(`--border-default`), per Figma, and differ only in elevation — `filled` keeps
`--shadow-sm`, which is the job it was already doing alone. The remove glyph
drops to `--text-muted` at rest and rises to `--text-default` on hover: at rest
it is punctuation after a label, on hover it is what is being aimed at.
Measured in Chromium against the Figma frames, both themes: fill #0a0a0a,
border #ffffff1a, 32px tall, 12px sides (4px trailing when removable), 24px
remove control.
# Conflicts:
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-tablet.png
@robson-junior-azionrobson-junior-azion changed the title feat(webkit)!: give chip three kinds and hand presence to the consumerfeat(webkit): give chip three kinds and hand presence to the consumerAug 14, 2026
robson-junior-azion
robson-junior-azion previously approved these changes Aug 14, 2026
@isaque-bock-azion
isaque-bock-azion merged commit 250fd62 into mainAug 14, 2026
23 checks passed
@isaque-bock-azion
isaque-bock-azion deleted the feat/chip-kinds branch August 14, 2026 21:17
gabriel-lisboa-azion added a commit that referenced this pull request Aug 17, 2026
Brings the three commits demo lacked, so the deployed sample exercises them
alongside the four fixes carved out of this branch (#899#902), whose content was
already here:
- feat(webkit): chip's three kinds (#883)
- feat(theme): the semantic/layouts container system (#884)
- feat(theme): lightened heading and body type (#876)
Conflict resolutions worth knowing:
`build-tokens.mjs` — main has no illustration tokens, so main's side of all six
hunks was empty. Taking it would have silently deleted this branch's illustration
wiring; ours was kept. The merge then produced a DUPLICATE `emitUtilities` and
`emitLayoutUtilities` with no conflict at all (both sides had added an identical
helper in different places), which is a syntax error the merge itself reported as
clean — the second copy is removed and `emitIllustrationUtilities` reuses the
first.
`texts.data.js` — the five conflicts were all `text-body-*` weight, resolved to
main's `light` since that is the change being previewed. Resolved in place rather
than with `--theirs`, which would have discarded the file's auto-merged hunks.
Entry count held at 144.
`.size-limit.json` — union, not a side: main's `chip` plus this branch's
`footer-root` and `resizable-panel-root`.
`dist/v4/globals.*` are generated, so they were rebuilt from the merged sources
rather than hand-merged. The 466 conflicting visual baselines took main's copies;
neither side is valid for a merged tree, and this branch opens no PR the visual
gate guards.
Verified after: no `undefined` in the built CSS, illustration tokens still emitted,
main's layout utilities present, body weights now 300, no token data file lost
entries, and 154 tests pass across toast, table, sidebar, resizable-panel and chip.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@gabriel-lisboa-azion@herbert-julio-azion@robson-junior-azion@isaque-bock-azion
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(webkit): give chip three kinds and hand presence to the consumer - #883

Merged
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds
Aug 14, 2026
Merged

feat(webkit): give chip three kinds and hand presence to the consumer#883
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds

Conversation

@gabriel-lisboa-azion

Copy link
Copy Markdown
Collaborator

What

Chip gains a kind axis covering the three jobs it actually does in a filter surface, so a consumer never has to restyle the component to get one of them:

kindJobTreatment
filled (default)a value that is appliedraised surface, border, shadow — the loudest, because it is state
outlineda value the user could applysame border, no fill, no shadow — recedes to an offer without becoming disabled
dashedthe control that creates a chipdashed outline, the standing "add another one of these" convention

The breaking part: presence is the consumer's

remove used to fade the chip to opacity: 0 and only then emit, so the chip decided its own disappearance. That could serve exactly one case — where removing a value also destroys the chip. A filter bar where a removed value stays on screen as an outlined offer was impossible: the instance stayed invisible forever.

remove now fires immediately and the chip stays mounted. Exit motion, where wanted, belongs to whatever owns the list — so table-applied-filters gains the TransitionGroup that actually destroys chips. That is why it ships in this PR: split apart, one half double-animates removal and the other un-animates it.

The inline style="transition: …" the old fade needed is gone too — an inline transition beats every transition-* class a consumer puts on the same element (see #881).

Also

  • The remove control is named after what it removes: aria-label="Remove Production", with a Tooltip carrying the same string, and a 24×24 target at medium (WCAG 2.5.8). A row of chips whose every button says "Remove" is unusable by voice or screen reader.
  • Enter/Space dispatch a real DOM click, so a Chip works as a Popover.Trigger / Dropdown.Trigger child from the keyboard.
  • Both sizes are now fixed heights (24px / 32px) rather than padding-driven, so a row of chips shares one baseline.
  • Adds the missing .size-limit.json row — chip now carries Tooltip, and nothing was measuring that. 4.27 KB gzipped against a 5 KB budget.

BREAKING CHANGE

  • remove no longer waits for a fade before emitting, and the chip no longer unmounts itself. A consumer relying on self-dismissal must now drop the chip from its own collection.
  • small is a fixed 24px (was 20px) and medium a fixed 32px (was ~30px from padding); medium uses text-label-sm.

Verification

33 chip tests pass, including the two that pin the new contract — "stays mounted after remove" and "declares no inline transition on the root". Catalog regenerated on this branch (not carried), so catalog:check is clean.

Adds kind: filled | outlined | dashed, fixes the two sizes at 24/32px, and
names the remove control after what it removes ("Remove $label") with a
tooltip carrying the same string and a 24x24 target.
The remove event now fires immediately and the chip stays mounted, so a
chip can survive its own removal (a filter chip that empties but remains).
The exit motion moves to table-applied-filters, which owns the
TransitionGroup that actually destroys chips.
Enter/Space now dispatch a real DOM click so a Chip works as a
Popover.Trigger child from the keyboard.
BREAKING CHANGE: remove no longer waits for a fade before emitting, and the
chip no longer unmounts itself — the consumer owns presence. Both sizes
changed to fixed heights (24px small, 32px medium) and medium now uses
text-label-sm.
Naming the remove control after what it removes brought Tooltip in as a
dependency, and chip had no size-limit row to catch that. It measures 4.27 KB
gzipped; the budget is 5 KB.
The Motion table named tooltip's animate-popup-scale-in/out utilities, and
the authoring ratchet reads that table per FILE — so it required classes in
chip.vue that belong to the component chip composes. The row now names the
owner and points at its spec instead of quoting its utilities, which is the
truer statement anyway: those tokens and their reduced-motion fallback are
tooltip's contract.
The chip's appearance changed on purpose — fixed 24/32px heights instead of
padding-driven, a pill radius, and text-label-sm at medium — so all six modes
diverged by 1.6-2.9%. Adds the snapshots for the new Types and Clickable
stories.
`filled` specified `bg-(--bg-surface-raised )` — with a stray space inside the
paren shorthand. The space terminates the Tailwind candidate, so the utility
compiled to no CSS at all and every `filled` chip has been fully transparent in
both themes, distinguishable from an `outlined` one only by its shadow.
The token would not have carried the distinction anyway: `--bg-surface-raised`
resolves to the same value as `--bg-surface` in the light theme, so the
applied/available contrast it was meant to express existed in dark only.
So all three kinds now share one fill (`--bg-surface`) and one border
(`--border-default`), per Figma, and differ only in elevation — `filled` keeps
`--shadow-sm`, which is the job it was already doing alone. The remove glyph
drops to `--text-muted` at rest and rises to `--text-default` on hover: at rest
it is punctuation after a label, on hover it is what is being aimed at.
Measured in Chromium against the Figma frames, both themes: fill #0a0a0a,
border #ffffff1a, 32px tall, 12px sides (4px trailing when removable), 24px
remove control.
# Conflicts:
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-tablet.png
@robson-junior-azionrobson-junior-azion changed the title feat(webkit)!: give chip three kinds and hand presence to the consumerfeat(webkit): give chip three kinds and hand presence to the consumerAug 14, 2026
robson-junior-azion
robson-junior-azion previously approved these changes Aug 14, 2026
@isaque-bock-azion
isaque-bock-azion merged commit 250fd62 into mainAug 14, 2026
23 checks passed
@isaque-bock-azion
isaque-bock-azion deleted the feat/chip-kinds branch August 14, 2026 21:17
gabriel-lisboa-azion added a commit that referenced this pull request Aug 17, 2026
Brings the three commits demo lacked, so the deployed sample exercises them
alongside the four fixes carved out of this branch (#899#902), whose content was
already here:
- feat(webkit): chip's three kinds (#883)
- feat(theme): the semantic/layouts container system (#884)
- feat(theme): lightened heading and body type (#876)
Conflict resolutions worth knowing:
`build-tokens.mjs` — main has no illustration tokens, so main's side of all six
hunks was empty. Taking it would have silently deleted this branch's illustration
wiring; ours was kept. The merge then produced a DUPLICATE `emitUtilities` and
`emitLayoutUtilities` with no conflict at all (both sides had added an identical
helper in different places), which is a syntax error the merge itself reported as
clean — the second copy is removed and `emitIllustrationUtilities` reuses the
first.
`texts.data.js` — the five conflicts were all `text-body-*` weight, resolved to
main's `light` since that is the change being previewed. Resolved in place rather
than with `--theirs`, which would have discarded the file's auto-merged hunks.
Entry count held at 144.
`.size-limit.json` — union, not a side: main's `chip` plus this branch's
`footer-root` and `resizable-panel-root`.
`dist/v4/globals.*` are generated, so they were rebuilt from the merged sources
rather than hand-merged. The 466 conflicting visual baselines took main's copies;
neither side is valid for a merged tree, and this branch opens no PR the visual
gate guards.
Verified after: no `undefined` in the built CSS, illustration tokens still emitted,
main's layout utilities present, body weights now 300, no token data file lost
entries, and 154 tests pass across toast, table, sidebar, resizable-panel and chip.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@gabriel-lisboa-azion@herbert-julio-azion@robson-junior-azion@isaque-bock-azion
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(webkit): give chip three kinds and hand presence to the consumer - #883

Merged
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds
Aug 14, 2026
Merged

feat(webkit): give chip three kinds and hand presence to the consumer#883
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds

Conversation

@gabriel-lisboa-azion

Copy link
Copy Markdown
Collaborator

What

Chip gains a kind axis covering the three jobs it actually does in a filter surface, so a consumer never has to restyle the component to get one of them:

kindJobTreatment
filled (default)a value that is appliedraised surface, border, shadow — the loudest, because it is state
outlineda value the user could applysame border, no fill, no shadow — recedes to an offer without becoming disabled
dashedthe control that creates a chipdashed outline, the standing "add another one of these" convention

The breaking part: presence is the consumer's

remove used to fade the chip to opacity: 0 and only then emit, so the chip decided its own disappearance. That could serve exactly one case — where removing a value also destroys the chip. A filter bar where a removed value stays on screen as an outlined offer was impossible: the instance stayed invisible forever.

remove now fires immediately and the chip stays mounted. Exit motion, where wanted, belongs to whatever owns the list — so table-applied-filters gains the TransitionGroup that actually destroys chips. That is why it ships in this PR: split apart, one half double-animates removal and the other un-animates it.

The inline style="transition: …" the old fade needed is gone too — an inline transition beats every transition-* class a consumer puts on the same element (see #881).

Also

  • The remove control is named after what it removes: aria-label="Remove Production", with a Tooltip carrying the same string, and a 24×24 target at medium (WCAG 2.5.8). A row of chips whose every button says "Remove" is unusable by voice or screen reader.
  • Enter/Space dispatch a real DOM click, so a Chip works as a Popover.Trigger / Dropdown.Trigger child from the keyboard.
  • Both sizes are now fixed heights (24px / 32px) rather than padding-driven, so a row of chips shares one baseline.
  • Adds the missing .size-limit.json row — chip now carries Tooltip, and nothing was measuring that. 4.27 KB gzipped against a 5 KB budget.

BREAKING CHANGE

  • remove no longer waits for a fade before emitting, and the chip no longer unmounts itself. A consumer relying on self-dismissal must now drop the chip from its own collection.
  • small is a fixed 24px (was 20px) and medium a fixed 32px (was ~30px from padding); medium uses text-label-sm.

Verification

33 chip tests pass, including the two that pin the new contract — "stays mounted after remove" and "declares no inline transition on the root". Catalog regenerated on this branch (not carried), so catalog:check is clean.

Adds kind: filled | outlined | dashed, fixes the two sizes at 24/32px, and
names the remove control after what it removes ("Remove $label") with a
tooltip carrying the same string and a 24x24 target.
The remove event now fires immediately and the chip stays mounted, so a
chip can survive its own removal (a filter chip that empties but remains).
The exit motion moves to table-applied-filters, which owns the
TransitionGroup that actually destroys chips.
Enter/Space now dispatch a real DOM click so a Chip works as a
Popover.Trigger child from the keyboard.
BREAKING CHANGE: remove no longer waits for a fade before emitting, and the
chip no longer unmounts itself — the consumer owns presence. Both sizes
changed to fixed heights (24px small, 32px medium) and medium now uses
text-label-sm.
Naming the remove control after what it removes brought Tooltip in as a
dependency, and chip had no size-limit row to catch that. It measures 4.27 KB
gzipped; the budget is 5 KB.
The Motion table named tooltip's animate-popup-scale-in/out utilities, and
the authoring ratchet reads that table per FILE — so it required classes in
chip.vue that belong to the component chip composes. The row now names the
owner and points at its spec instead of quoting its utilities, which is the
truer statement anyway: those tokens and their reduced-motion fallback are
tooltip's contract.
The chip's appearance changed on purpose — fixed 24/32px heights instead of
padding-driven, a pill radius, and text-label-sm at medium — so all six modes
diverged by 1.6-2.9%. Adds the snapshots for the new Types and Clickable
stories.
`filled` specified `bg-(--bg-surface-raised )` — with a stray space inside the
paren shorthand. The space terminates the Tailwind candidate, so the utility
compiled to no CSS at all and every `filled` chip has been fully transparent in
both themes, distinguishable from an `outlined` one only by its shadow.
The token would not have carried the distinction anyway: `--bg-surface-raised`
resolves to the same value as `--bg-surface` in the light theme, so the
applied/available contrast it was meant to express existed in dark only.
So all three kinds now share one fill (`--bg-surface`) and one border
(`--border-default`), per Figma, and differ only in elevation — `filled` keeps
`--shadow-sm`, which is the job it was already doing alone. The remove glyph
drops to `--text-muted` at rest and rises to `--text-default` on hover: at rest
it is punctuation after a label, on hover it is what is being aimed at.
Measured in Chromium against the Figma frames, both themes: fill #0a0a0a,
border #ffffff1a, 32px tall, 12px sides (4px trailing when removable), 24px
remove control.
# Conflicts:
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-tablet.png
@robson-junior-azionrobson-junior-azion changed the title feat(webkit)!: give chip three kinds and hand presence to the consumerfeat(webkit): give chip three kinds and hand presence to the consumerAug 14, 2026
robson-junior-azion
robson-junior-azion previously approved these changes Aug 14, 2026
@isaque-bock-azion
isaque-bock-azion merged commit 250fd62 into mainAug 14, 2026
23 checks passed
@isaque-bock-azion
isaque-bock-azion deleted the feat/chip-kinds branch August 14, 2026 21:17
gabriel-lisboa-azion added a commit that referenced this pull request Aug 17, 2026
Brings the three commits demo lacked, so the deployed sample exercises them
alongside the four fixes carved out of this branch (#899#902), whose content was
already here:
- feat(webkit): chip's three kinds (#883)
- feat(theme): the semantic/layouts container system (#884)
- feat(theme): lightened heading and body type (#876)
Conflict resolutions worth knowing:
`build-tokens.mjs` — main has no illustration tokens, so main's side of all six
hunks was empty. Taking it would have silently deleted this branch's illustration
wiring; ours was kept. The merge then produced a DUPLICATE `emitUtilities` and
`emitLayoutUtilities` with no conflict at all (both sides had added an identical
helper in different places), which is a syntax error the merge itself reported as
clean — the second copy is removed and `emitIllustrationUtilities` reuses the
first.
`texts.data.js` — the five conflicts were all `text-body-*` weight, resolved to
main's `light` since that is the change being previewed. Resolved in place rather
than with `--theirs`, which would have discarded the file's auto-merged hunks.
Entry count held at 144.
`.size-limit.json` — union, not a side: main's `chip` plus this branch's
`footer-root` and `resizable-panel-root`.
`dist/v4/globals.*` are generated, so they were rebuilt from the merged sources
rather than hand-merged. The 466 conflicting visual baselines took main's copies;
neither side is valid for a merged tree, and this branch opens no PR the visual
gate guards.
Verified after: no `undefined` in the built CSS, illustration tokens still emitted,
main's layout utilities present, body weights now 300, no token data file lost
entries, and 154 tests pass across toast, table, sidebar, resizable-panel and chip.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@gabriel-lisboa-azion@herbert-julio-azion@robson-junior-azion@isaque-bock-azion
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(webkit): give chip three kinds and hand presence to the consumer - #883

Merged
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds
Aug 14, 2026
Merged

feat(webkit): give chip three kinds and hand presence to the consumer#883
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds

Conversation

@gabriel-lisboa-azion

Copy link
Copy Markdown
Collaborator

What

Chip gains a kind axis covering the three jobs it actually does in a filter surface, so a consumer never has to restyle the component to get one of them:

kindJobTreatment
filled (default)a value that is appliedraised surface, border, shadow — the loudest, because it is state
outlineda value the user could applysame border, no fill, no shadow — recedes to an offer without becoming disabled
dashedthe control that creates a chipdashed outline, the standing "add another one of these" convention

The breaking part: presence is the consumer's

remove used to fade the chip to opacity: 0 and only then emit, so the chip decided its own disappearance. That could serve exactly one case — where removing a value also destroys the chip. A filter bar where a removed value stays on screen as an outlined offer was impossible: the instance stayed invisible forever.

remove now fires immediately and the chip stays mounted. Exit motion, where wanted, belongs to whatever owns the list — so table-applied-filters gains the TransitionGroup that actually destroys chips. That is why it ships in this PR: split apart, one half double-animates removal and the other un-animates it.

The inline style="transition: …" the old fade needed is gone too — an inline transition beats every transition-* class a consumer puts on the same element (see #881).

Also

  • The remove control is named after what it removes: aria-label="Remove Production", with a Tooltip carrying the same string, and a 24×24 target at medium (WCAG 2.5.8). A row of chips whose every button says "Remove" is unusable by voice or screen reader.
  • Enter/Space dispatch a real DOM click, so a Chip works as a Popover.Trigger / Dropdown.Trigger child from the keyboard.
  • Both sizes are now fixed heights (24px / 32px) rather than padding-driven, so a row of chips shares one baseline.
  • Adds the missing .size-limit.json row — chip now carries Tooltip, and nothing was measuring that. 4.27 KB gzipped against a 5 KB budget.

BREAKING CHANGE

  • remove no longer waits for a fade before emitting, and the chip no longer unmounts itself. A consumer relying on self-dismissal must now drop the chip from its own collection.
  • small is a fixed 24px (was 20px) and medium a fixed 32px (was ~30px from padding); medium uses text-label-sm.

Verification

33 chip tests pass, including the two that pin the new contract — "stays mounted after remove" and "declares no inline transition on the root". Catalog regenerated on this branch (not carried), so catalog:check is clean.

Adds kind: filled | outlined | dashed, fixes the two sizes at 24/32px, and
names the remove control after what it removes ("Remove $label") with a
tooltip carrying the same string and a 24x24 target.
The remove event now fires immediately and the chip stays mounted, so a
chip can survive its own removal (a filter chip that empties but remains).
The exit motion moves to table-applied-filters, which owns the
TransitionGroup that actually destroys chips.
Enter/Space now dispatch a real DOM click so a Chip works as a
Popover.Trigger child from the keyboard.
BREAKING CHANGE: remove no longer waits for a fade before emitting, and the
chip no longer unmounts itself — the consumer owns presence. Both sizes
changed to fixed heights (24px small, 32px medium) and medium now uses
text-label-sm.
Naming the remove control after what it removes brought Tooltip in as a
dependency, and chip had no size-limit row to catch that. It measures 4.27 KB
gzipped; the budget is 5 KB.
The Motion table named tooltip's animate-popup-scale-in/out utilities, and
the authoring ratchet reads that table per FILE — so it required classes in
chip.vue that belong to the component chip composes. The row now names the
owner and points at its spec instead of quoting its utilities, which is the
truer statement anyway: those tokens and their reduced-motion fallback are
tooltip's contract.
The chip's appearance changed on purpose — fixed 24/32px heights instead of
padding-driven, a pill radius, and text-label-sm at medium — so all six modes
diverged by 1.6-2.9%. Adds the snapshots for the new Types and Clickable
stories.
`filled` specified `bg-(--bg-surface-raised )` — with a stray space inside the
paren shorthand. The space terminates the Tailwind candidate, so the utility
compiled to no CSS at all and every `filled` chip has been fully transparent in
both themes, distinguishable from an `outlined` one only by its shadow.
The token would not have carried the distinction anyway: `--bg-surface-raised`
resolves to the same value as `--bg-surface` in the light theme, so the
applied/available contrast it was meant to express existed in dark only.
So all three kinds now share one fill (`--bg-surface`) and one border
(`--border-default`), per Figma, and differ only in elevation — `filled` keeps
`--shadow-sm`, which is the job it was already doing alone. The remove glyph
drops to `--text-muted` at rest and rises to `--text-default` on hover: at rest
it is punctuation after a label, on hover it is what is being aimed at.
Measured in Chromium against the Figma frames, both themes: fill #0a0a0a,
border #ffffff1a, 32px tall, 12px sides (4px trailing when removable), 24px
remove control.
# Conflicts:
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-tablet.png
@robson-junior-azionrobson-junior-azion changed the title feat(webkit)!: give chip three kinds and hand presence to the consumerfeat(webkit): give chip three kinds and hand presence to the consumerAug 14, 2026
robson-junior-azion
robson-junior-azion previously approved these changes Aug 14, 2026
@isaque-bock-azion
isaque-bock-azion merged commit 250fd62 into mainAug 14, 2026
23 checks passed
@isaque-bock-azion
isaque-bock-azion deleted the feat/chip-kinds branch August 14, 2026 21:17
gabriel-lisboa-azion added a commit that referenced this pull request Aug 17, 2026
Brings the three commits demo lacked, so the deployed sample exercises them
alongside the four fixes carved out of this branch (#899#902), whose content was
already here:
- feat(webkit): chip's three kinds (#883)
- feat(theme): the semantic/layouts container system (#884)
- feat(theme): lightened heading and body type (#876)
Conflict resolutions worth knowing:
`build-tokens.mjs` — main has no illustration tokens, so main's side of all six
hunks was empty. Taking it would have silently deleted this branch's illustration
wiring; ours was kept. The merge then produced a DUPLICATE `emitUtilities` and
`emitLayoutUtilities` with no conflict at all (both sides had added an identical
helper in different places), which is a syntax error the merge itself reported as
clean — the second copy is removed and `emitIllustrationUtilities` reuses the
first.
`texts.data.js` — the five conflicts were all `text-body-*` weight, resolved to
main's `light` since that is the change being previewed. Resolved in place rather
than with `--theirs`, which would have discarded the file's auto-merged hunks.
Entry count held at 144.
`.size-limit.json` — union, not a side: main's `chip` plus this branch's
`footer-root` and `resizable-panel-root`.
`dist/v4/globals.*` are generated, so they were rebuilt from the merged sources
rather than hand-merged. The 466 conflicting visual baselines took main's copies;
neither side is valid for a merged tree, and this branch opens no PR the visual
gate guards.
Verified after: no `undefined` in the built CSS, illustration tokens still emitted,
main's layout utilities present, body weights now 300, no token data file lost
entries, and 154 tests pass across toast, table, sidebar, resizable-panel and chip.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@gabriel-lisboa-azion@herbert-julio-azion@robson-junior-azion@isaque-bock-azion
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(webkit): give chip three kinds and hand presence to the consumer - #883

Merged
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds
Aug 14, 2026
Merged

feat(webkit): give chip three kinds and hand presence to the consumer#883
isaque-bock-azion merged 12 commits into
mainfrom
feat/chip-kinds

Conversation

@gabriel-lisboa-azion

Copy link
Copy Markdown
Collaborator

What

Chip gains a kind axis covering the three jobs it actually does in a filter surface, so a consumer never has to restyle the component to get one of them:

kindJobTreatment
filled (default)a value that is appliedraised surface, border, shadow — the loudest, because it is state
outlineda value the user could applysame border, no fill, no shadow — recedes to an offer without becoming disabled
dashedthe control that creates a chipdashed outline, the standing "add another one of these" convention

The breaking part: presence is the consumer's

remove used to fade the chip to opacity: 0 and only then emit, so the chip decided its own disappearance. That could serve exactly one case — where removing a value also destroys the chip. A filter bar where a removed value stays on screen as an outlined offer was impossible: the instance stayed invisible forever.

remove now fires immediately and the chip stays mounted. Exit motion, where wanted, belongs to whatever owns the list — so table-applied-filters gains the TransitionGroup that actually destroys chips. That is why it ships in this PR: split apart, one half double-animates removal and the other un-animates it.

The inline style="transition: …" the old fade needed is gone too — an inline transition beats every transition-* class a consumer puts on the same element (see #881).

Also

  • The remove control is named after what it removes: aria-label="Remove Production", with a Tooltip carrying the same string, and a 24×24 target at medium (WCAG 2.5.8). A row of chips whose every button says "Remove" is unusable by voice or screen reader.
  • Enter/Space dispatch a real DOM click, so a Chip works as a Popover.Trigger / Dropdown.Trigger child from the keyboard.
  • Both sizes are now fixed heights (24px / 32px) rather than padding-driven, so a row of chips shares one baseline.
  • Adds the missing .size-limit.json row — chip now carries Tooltip, and nothing was measuring that. 4.27 KB gzipped against a 5 KB budget.

BREAKING CHANGE

  • remove no longer waits for a fade before emitting, and the chip no longer unmounts itself. A consumer relying on self-dismissal must now drop the chip from its own collection.
  • small is a fixed 24px (was 20px) and medium a fixed 32px (was ~30px from padding); medium uses text-label-sm.

Verification

33 chip tests pass, including the two that pin the new contract — "stays mounted after remove" and "declares no inline transition on the root". Catalog regenerated on this branch (not carried), so catalog:check is clean.

Adds kind: filled | outlined | dashed, fixes the two sizes at 24/32px, and
names the remove control after what it removes ("Remove $label") with a
tooltip carrying the same string and a 24x24 target.
The remove event now fires immediately and the chip stays mounted, so a
chip can survive its own removal (a filter chip that empties but remains).
The exit motion moves to table-applied-filters, which owns the
TransitionGroup that actually destroys chips.
Enter/Space now dispatch a real DOM click so a Chip works as a
Popover.Trigger child from the keyboard.
BREAKING CHANGE: remove no longer waits for a fade before emitting, and the
chip no longer unmounts itself — the consumer owns presence. Both sizes
changed to fixed heights (24px small, 32px medium) and medium now uses
text-label-sm.
Naming the remove control after what it removes brought Tooltip in as a
dependency, and chip had no size-limit row to catch that. It measures 4.27 KB
gzipped; the budget is 5 KB.
The Motion table named tooltip's animate-popup-scale-in/out utilities, and
the authoring ratchet reads that table per FILE — so it required classes in
chip.vue that belong to the component chip composes. The row now names the
owner and points at its spec instead of quoting its utilities, which is the
truer statement anyway: those tokens and their reduced-motion fallback are
tooltip's contract.
The chip's appearance changed on purpose — fixed 24/32px heights instead of
padding-driven, a pill radius, and text-label-sm at medium — so all six modes
diverged by 1.6-2.9%. Adds the snapshots for the new Types and Clickable
stories.
`filled` specified `bg-(--bg-surface-raised )` — with a stray space inside the
paren shorthand. The space terminates the Tailwind candidate, so the utility
compiled to no CSS at all and every `filled` chip has been fully transparent in
both themes, distinguishable from an `outlined` one only by its shadow.
The token would not have carried the distinction anyway: `--bg-surface-raised`
resolves to the same value as `--bg-surface` in the light theme, so the
applied/available contrast it was meant to express existed in dark only.
So all three kinds now share one fill (`--bg-surface`) and one border
(`--border-default`), per Figma, and differ only in elevation — `filled` keeps
`--shadow-sm`, which is the job it was already doing alone. The remove glyph
drops to `--text-muted` at rest and rises to `--text-default` on hover: at rest
it is punctuation after a label, on hover it is what is being aimed at.
Measured in Chromium against the Figma frames, both themes: fill #0a0a0a,
border #ffffff1a, 32px tall, 12px sides (4px trailing when removable), 24px
remove control.
# Conflicts:
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--clickable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--default--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--removable--light-tablet.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-mobile.png
#	apps/storybook/.storybook/test-visual/__image_snapshots__/linux/components-inputs-chip--sizes--light-tablet.png
@robson-junior-azionrobson-junior-azion changed the title feat(webkit)!: give chip three kinds and hand presence to the consumerfeat(webkit): give chip three kinds and hand presence to the consumerAug 14, 2026
robson-junior-azion
robson-junior-azion previously approved these changes Aug 14, 2026
@isaque-bock-azion
isaque-bock-azion merged commit 250fd62 into mainAug 14, 2026
23 checks passed
@isaque-bock-azion
isaque-bock-azion deleted the feat/chip-kinds branch August 14, 2026 21:17
gabriel-lisboa-azion added a commit that referenced this pull request Aug 17, 2026
Brings the three commits demo lacked, so the deployed sample exercises them
alongside the four fixes carved out of this branch (#899#902), whose content was
already here:
- feat(webkit): chip's three kinds (#883)
- feat(theme): the semantic/layouts container system (#884)
- feat(theme): lightened heading and body type (#876)
Conflict resolutions worth knowing:
`build-tokens.mjs` — main has no illustration tokens, so main's side of all six
hunks was empty. Taking it would have silently deleted this branch's illustration
wiring; ours was kept. The merge then produced a DUPLICATE `emitUtilities` and
`emitLayoutUtilities` with no conflict at all (both sides had added an identical
helper in different places), which is a syntax error the merge itself reported as
clean — the second copy is removed and `emitIllustrationUtilities` reuses the
first.
`texts.data.js` — the five conflicts were all `text-body-*` weight, resolved to
main's `light` since that is the change being previewed. Resolved in place rather
than with `--theirs`, which would have discarded the file's auto-merged hunks.
Entry count held at 144.
`.size-limit.json` — union, not a side: main's `chip` plus this branch's
`footer-root` and `resizable-panel-root`.
`dist/v4/globals.*` are generated, so they were rebuilt from the merged sources
rather than hand-merged. The 466 conflicting visual baselines took main's copies;
neither side is valid for a merged tree, and this branch opens no PR the visual
gate guards.
Verified after: no `undefined` in the built CSS, illustration tokens still emitted,
main's layout utilities present, body weights now 300, no token data file lost
entries, and 154 tests pass across toast, table, sidebar, resizable-panel and chip.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@gabriel-lisboa-azion@herbert-julio-azion@robson-junior-azion@isaque-bock-azion