@cueplusplus/ui 0.15.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1083 -0
- package/README.md +26 -0
- package/dist/agent-runtime/tool-call-card.js +7 -3
- package/dist/brand/_chassis.d.ts +1 -1
- package/dist/brand/cue-mark.d.ts +1 -1
- package/dist/brand/cue-mark.js +1 -1
- package/dist/charts/ramps.js +1 -1
- package/dist/chat/agent-pile.js +2 -1
- package/dist/chat/ask-box.js +4 -3
- package/dist/chat/delegation-card.js +3 -2
- package/dist/chat/message-list.js +4 -2
- package/dist/chat/message.js +17 -7
- package/dist/chrome/_edge-scroller.js +2 -1
- package/dist/chrome/_status-bar.js +9 -3
- package/dist/chrome/_tabs-scroll.d.ts +17 -1
- package/dist/chrome/_tabs-scroll.js +20 -3
- package/dist/chrome/app-bar.js +10 -3
- package/dist/chrome/app-shell.js +2 -1
- package/dist/chrome/band.d.ts +18 -12
- package/dist/chrome/band.js +19 -31
- package/dist/chrome/eyebrow.d.ts +13 -5
- package/dist/chrome/eyebrow.js +18 -7
- package/dist/chrome/footer.d.ts +5 -0
- package/dist/chrome/footer.js +14 -3
- package/dist/chrome/navigation-menu.js +4 -2
- package/dist/chrome/page-shell.js +8 -5
- package/dist/chrome/panel.d.ts +5 -2
- package/dist/chrome/panel.js +9 -4
- package/dist/chrome/row.js +6 -3
- package/dist/chrome/scroll-area.js +2 -1
- package/dist/chrome/section-header.js +13 -4
- package/dist/chrome/segmented-control.js +12 -3
- package/dist/chrome/status-bar.js +2 -1
- package/dist/chrome/tabs.js +11 -3
- package/dist/chrome/toolbar.js +2 -1
- package/dist/chrome/tree.js +3 -2
- package/dist/color/_thumb.js +9 -3
- package/dist/color/color-area.js +1 -1
- package/dist/color/color-field.d.ts +2 -1
- package/dist/color/color-picker.d.ts +2 -1
- package/dist/color/color-swatch.js +1 -1
- package/dist/configurator/_overrides.js +13 -4
- package/dist/configurator/configurator.js +4 -1
- package/dist/configurator/export-dialog.js +5 -2
- package/dist/configurator/panel-sections.js +6 -2
- package/dist/configurator/token-editor.js +4 -1
- package/dist/date/calendar.js +12 -8
- package/dist/date/date-field.d.ts +2 -1
- package/dist/date/date-picker.d.ts +2 -1
- package/dist/date/date-range-picker.d.ts +2 -1
- package/dist/date/time-field.d.ts +2 -1
- package/dist/dmx/channel-matrix.js +3 -2
- package/dist/dmx/dmx-bar.js +1 -1
- package/dist/dmx/dmx-strip.js +1 -1
- package/dist/dmx/universe-grid.js +3 -2
- package/dist/elements/activity-graph.js +3 -3
- package/dist/elements/agent-card.js +3 -3
- package/dist/elements/approval-card.js +3 -3
- package/dist/elements/artifact-card.js +2 -2
- package/dist/elements/background-inbox.js +2 -2
- package/dist/elements/canvas-split.js +2 -2
- package/dist/elements/chart.js +1 -1
- package/dist/elements/chat-panel.js +2 -2
- package/dist/elements/checkpoint-history.js +2 -2
- package/dist/elements/clamp.js +2 -1
- package/dist/elements/code-diff.js +1 -1
- package/dist/elements/code-runner.js +1 -1
- package/dist/elements/command-palette.js +6 -5
- package/dist/elements/comparison-card.js +2 -2
- package/dist/elements/composer.js +9 -8
- package/dist/elements/computer-use.js +1 -1
- package/dist/elements/confidence-marker.js +2 -1
- package/dist/elements/connection-state.js +1 -1
- package/dist/elements/context-breakdown.js +1 -1
- package/dist/elements/context-usage.js +1 -1
- package/dist/elements/conversation-search.js +4 -3
- package/dist/elements/cost-meter.js +1 -1
- package/dist/elements/data-table.js +2 -2
- package/dist/elements/day-separator.js +1 -1
- package/dist/elements/diagram.js +1 -1
- package/dist/elements/document-reference.js +3 -3
- package/dist/elements/draft-restore.js +1 -1
- package/dist/elements/edit-message.js +4 -3
- package/dist/elements/elements.css +26 -5
- package/dist/elements/elicitation-form.js +3 -3
- package/dist/elements/empty-state.js +2 -1
- package/dist/elements/error-state.js +1 -1
- package/dist/elements/feedback-dialog.js +4 -3
- package/dist/elements/file-tree.js +2 -2
- package/dist/elements/flow-graph.js +2 -2
- package/dist/elements/guardrail-notice.js +3 -3
- package/dist/elements/image-generation.js +1 -1
- package/dist/elements/inline-citation.js +3 -3
- package/dist/elements/job-progress.js +3 -3
- package/dist/elements/launcher-bubble.js +2 -2
- package/dist/elements/loading-state.js +1 -1
- package/dist/elements/map-answer.js +3 -2
- package/dist/elements/markdown.js +5 -4
- package/dist/elements/math-block.js +1 -1
- package/dist/elements/mcp-server-panel.js +3 -3
- package/dist/elements/message-attachment.js +4 -4
- package/dist/elements/message-pair.js +1 -1
- package/dist/elements/message-queue.js +2 -2
- package/dist/elements/mobile-composer.js +4 -3
- package/dist/elements/model-picker.js +3 -3
- package/dist/elements/onboarding.js +2 -2
- package/dist/elements/permission-grant.js +2 -2
- package/dist/elements/permission-scopes.js +5 -4
- package/dist/elements/prompt-library.js +7 -6
- package/dist/elements/queue-dock.js +4 -3
- package/dist/elements/quota-banner.js +1 -1
- package/dist/elements/quote-reply.js +1 -1
- package/dist/elements/read-aloud.js +2 -2
- package/dist/elements/reasoning-panel.js +2 -1
- package/dist/elements/recommendation-card.d.ts +1 -1
- package/dist/elements/recommendation-card.js +2 -2
- package/dist/elements/regenerate-menu.js +2 -2
- package/dist/elements/research-report.js +1 -1
- package/dist/elements/retrieval-chunks.js +1 -1
- package/dist/elements/revert-dock.js +5 -4
- package/dist/elements/reviewable-diff.js +1 -1
- package/dist/elements/schedule-card.js +3 -3
- package/dist/elements/score-breakdown.js +1 -1
- package/dist/elements/scroll-anchor.js +2 -2
- package/dist/elements/settings-panel.js +3 -2
- package/dist/elements/shared-conversation.js +2 -2
- package/dist/elements/sources.js +4 -3
- package/dist/elements/speaker-identity.js +1 -1
- package/dist/elements/spec-sheet.js +1 -1
- package/dist/elements/streaming-text.js +1 -1
- package/dist/elements/subagent-list.js +2 -2
- package/dist/elements/suggestions.js +1 -1
- package/dist/elements/surfaces.d.ts +1 -1
- package/dist/elements/surfaces.js +2 -1
- package/dist/elements/tail-status.js +1 -1
- package/dist/elements/terminal-block.js +1 -1
- package/dist/elements/thread-list.js +1 -1
- package/dist/elements/thread-search.js +5 -4
- package/dist/elements/timeline.js +1 -1
- package/dist/elements/todo-list.js +2 -2
- package/dist/elements/tool-call.js +4 -3
- package/dist/elements/tool-error.js +2 -2
- package/dist/elements/tool-group.js +1 -1
- package/dist/elements/tool-timeline.js +4 -3
- package/dist/elements/trace-waterfall.js +1 -1
- package/dist/elements/verdict-row.js +2 -2
- package/dist/elements/voice-conversation.js +3 -2
- package/dist/elements/web-preview.js +1 -1
- package/dist/elements/web-search.js +2 -2
- package/dist/elements/work-collapse.js +2 -1
- package/dist/flow/node-card.js +3 -2
- package/dist/flow/use-flow-theme.js +2 -1
- package/dist/forms/_chassis-size.d.ts +22 -0
- package/dist/forms/_chassis.d.ts +28 -15
- package/dist/forms/_chassis.js +34 -8
- package/dist/forms/_listbox.js +8 -5
- package/dist/forms/autocomplete.d.ts +2 -1
- package/dist/forms/checkbox.js +8 -2
- package/dist/forms/combobox.d.ts +2 -1
- package/dist/forms/env-var-input.d.ts +2 -1
- package/dist/forms/env-var-input.js +3 -2
- package/dist/forms/field.d.ts +2 -1
- package/dist/forms/field.js +15 -4
- package/dist/forms/file-upload.js +3 -2
- package/dist/forms/index.d.ts +2 -1
- package/dist/forms/input-group.d.ts +2 -1
- package/dist/forms/input.d.ts +2 -1
- package/dist/forms/multi-select.d.ts +2 -1
- package/dist/forms/number-field.js +2 -1
- package/dist/forms/otp-field.d.ts +2 -1
- package/dist/forms/password-input.d.ts +2 -1
- package/dist/forms/password-input.js +4 -2
- package/dist/forms/radio-group.js +6 -2
- package/dist/forms/rating.js +2 -1
- package/dist/forms/scrub-input.d.ts +2 -1
- package/dist/forms/scrub-input.js +2 -1
- package/dist/forms/search-input.d.ts +2 -1
- package/dist/forms/search-input.js +2 -1
- package/dist/forms/select.d.ts +2 -1
- package/dist/forms/select.js +6 -2
- package/dist/forms/slider.js +6 -2
- package/dist/forms/switch.js +6 -2
- package/dist/forms/tags-input.d.ts +2 -1
- package/dist/forms/textarea.js +2 -1
- package/dist/forms/toggle-group.d.ts +1 -1
- package/dist/forms/toggle.d.ts +1 -1
- package/dist/forms/toggle.js +3 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +2 -2
- package/dist/instruments/_data-row.js +2 -1
- package/dist/instruments/app-window-frame.js +1 -1
- package/dist/instruments/code-block.js +8 -2
- package/dist/instruments/group-bar.js +1 -1
- package/dist/instruments/ledger.js +6 -2
- package/dist/instruments/log-viewer.js +5 -3
- package/dist/instruments/progress.js +5 -2
- package/dist/instruments/seam-grid.js +5 -3
- package/dist/instruments/stat.js +10 -3
- package/dist/instruments/table.js +28 -10
- package/dist/instruments/terminal-frame.js +4 -2
- package/dist/instruments/usage-chart.js +1 -1
- package/dist/layout/_collapse.js +6 -1
- package/dist/layout/bento.js +7 -4
- package/dist/layout/breadcrumb.js +7 -3
- package/dist/layout/card.js +14 -6
- package/dist/layout/carousel.js +3 -2
- package/dist/layout/collapsible.js +5 -1
- package/dist/layout/container.js +2 -1
- package/dist/layout/description-list.js +4 -1
- package/dist/layout/frames.js +11 -5
- package/dist/layout/item.js +3 -2
- package/dist/layout/link.d.ts +16 -0
- package/dist/layout/link.js +22 -3
- package/dist/layout/pagination.js +2 -1
- package/dist/layout/preview.d.ts +32 -12
- package/dist/layout/preview.js +149 -40
- package/dist/layout/resizable.js +2 -1
- package/dist/layout/sidebar.js +11 -3
- package/dist/layout/stepper.js +6 -2
- package/dist/lib/cn.js +29 -2
- package/dist/midi/musical-time-input.d.ts +2 -1
- package/dist/midi/piano-keyboard.js +3 -2
- package/dist/midi/spectrum-visualizer.js +1 -1
- package/dist/midi/threshold-rail.js +2 -1
- package/dist/midi/timeline-ruler.js +1 -1
- package/dist/overlays/_surface.d.ts +72 -12
- package/dist/overlays/_surface.js +86 -12
- package/dist/overlays/command-palette.js +9 -5
- package/dist/overlays/dialog.d.ts +5 -0
- package/dist/overlays/dialog.js +6 -1
- package/dist/overlays/info-tip.js +2 -1
- package/dist/overlays/menubar.js +3 -1
- package/dist/overlays/popover.js +2 -1
- package/dist/overlays/toast.js +6 -2
- package/dist/overlays/tooltip.js +4 -1
- package/dist/primitives/button.d.ts +15 -0
- package/dist/primitives/button.js +40 -10
- package/dist/primitives/chip.d.ts +20 -2
- package/dist/primitives/chip.js +39 -17
- package/dist/primitives/kbd.d.ts +6 -0
- package/dist/primitives/kbd.js +10 -1
- package/dist/primitives/skeleton.js +1 -1
- package/dist/system/_focus-ring-field.js +29 -0
- package/dist/system/_focus-ring.js +125 -0
- package/dist/system/_paint-elevation.js +9 -0
- package/dist/system/_paint-glass.js +46 -0
- package/dist/system/_paint-glow.js +51 -0
- package/dist/system/_paint-ground-pattern.js +30 -0
- package/dist/system/_paint-rest-shade.js +32 -0
- package/dist/system/_paint-rim.js +59 -0
- package/dist/system/_paint-stroke-sunken.js +19 -0
- package/dist/system/_paint-stroke-surface-1.js +19 -0
- package/dist/system/_paint-stroke-surface-2.js +40 -0
- package/dist/system/_paint-texture.js +56 -0
- package/dist/system/_style-app-bar.js +65 -0
- package/dist/system/_style-band.js +57 -0
- package/dist/system/_style-body-leading.js +21 -0
- package/dist/system/_style-body-size.js +30 -0
- package/dist/system/_style-body-weight.js +24 -0
- package/dist/system/_style-body.js +27 -0
- package/dist/system/_style-caption.js +19 -0
- package/dist/system/_style-card-pad.js +43 -0
- package/dist/system/_style-check.js +33 -0
- package/dist/system/_style-chip.js +103 -0
- package/dist/system/_style-code.js +13 -0
- package/dist/system/_style-collapse.js +14 -0
- package/dist/system/_style-control-face.js +29 -0
- package/dist/system/_style-control-label.js +22 -0
- package/dist/system/_style-control-step.js +22 -0
- package/dist/system/_style-control.js +76 -0
- package/dist/system/_style-data-face.js +28 -0
- package/dist/system/_style-description.js +23 -0
- package/dist/system/_style-eyebrow.js +43 -0
- package/dist/system/_style-footer-rule.js +47 -0
- package/dist/system/_style-gutter.js +17 -0
- package/dist/system/_style-help-ink.js +14 -0
- package/dist/system/_style-help.js +29 -0
- package/dist/system/_style-input-face.js +34 -0
- package/dist/system/_style-kbd.js +46 -0
- package/dist/system/_style-label-case.js +36 -0
- package/dist/system/_style-label-face.js +32 -0
- package/dist/system/_style-label-ink.js +29 -0
- package/dist/system/_style-label-leading.js +14 -0
- package/dist/system/_style-label-size.js +36 -0
- package/dist/system/_style-label-tracking.js +45 -0
- package/dist/system/_style-label-weight.js +40 -0
- package/dist/system/_style-lede.js +49 -0
- package/dist/system/_style-link.js +46 -0
- package/dist/system/_style-menu.js +30 -0
- package/dist/system/_style-nav-item.js +41 -0
- package/dist/system/_style-nav-voice.js +43 -0
- package/dist/system/_style-option.js +42 -0
- package/dist/system/_style-overlay-title.js +35 -0
- package/dist/system/_style-page-title.js +48 -0
- package/dist/system/_style-popover-pad.js +13 -0
- package/dist/system/_style-quiet-ink.js +13 -0
- package/dist/system/_style-row-pad.js +13 -0
- package/dist/system/_style-seam.js +43 -0
- package/dist/system/_style-section-rule.js +26 -0
- package/dist/system/_style-segment.js +30 -0
- package/dist/system/_style-segmented-control.js +86 -0
- package/dist/system/_style-selected.js +36 -0
- package/dist/system/_style-stage-marks.js +26 -0
- package/dist/system/_style-tab.js +71 -0
- package/dist/system/_style-textarea.js +21 -0
- package/dist/system/_style-title.js +37 -0
- package/dist/system/_style-tooltip.js +17 -0
- package/dist/system/density.d.ts +15 -5
- package/dist/system/density.js +188 -25
- package/dist/system/index.d.ts +2 -2
- package/dist/system/index.js +2 -2
- package/dist/system/overrides.d.ts +1 -0
- package/dist/system/overrides.js +151 -3
- package/dist/system/portal.d.ts +3 -2
- package/dist/system/portal.js +22 -10
- package/dist/system/prepaint.d.ts +21 -5
- package/dist/system/prepaint.js +3 -1
- package/dist/system/published.d.ts +1 -0
- package/dist/system/published.js +131 -0
- package/dist/system/theme-provider.d.ts +168 -60
- package/dist/system/theme-provider.js +375 -79
- package/dist/system/theme-registry.d.ts +2 -1
- package/dist/system/theme-registry.js +27 -10
- package/dist/system/use-density.js +4 -3
- package/dist/system/use-theme.d.ts +5 -2
- package/dist/system/use-theme.js +7 -4
- package/dist/system/vocabulary.js +2 -2
- package/dist/theming/create-theme.js +12 -6
- package/dist/theming/serialize.d.ts +34 -2
- package/dist/theming/serialize.js +86 -4
- package/manifest/components/accordion.json +7 -1
- package/manifest/components/agent-pile.json +3 -0
- package/manifest/components/alert-dialog.json +38 -1
- package/manifest/components/app-bar.json +23 -2
- package/manifest/components/app-shell.json +5 -0
- package/manifest/components/ask-box.json +3 -1
- package/manifest/components/autocomplete.json +49 -1
- package/manifest/components/band.json +14 -3
- package/manifest/components/bento.json +12 -1
- package/manifest/components/breadcrumb.json +8 -1
- package/manifest/components/button.json +31 -3
- package/manifest/components/calendar.json +7 -0
- package/manifest/components/card.json +28 -1
- package/manifest/components/carousel.json +4 -1
- package/manifest/components/channel-matrix.json +40 -1
- package/manifest/components/chart-tooltip-content.json +38 -1
- package/manifest/components/chat-empty-state.json +3 -1
- package/manifest/components/checkbox-group.json +14 -0
- package/manifest/components/checkbox.json +14 -0
- package/manifest/components/chip.json +16 -1
- package/manifest/components/clamp.json +3 -1
- package/manifest/components/code-block.json +10 -1
- package/manifest/components/collapsible.json +13 -2
- package/manifest/components/color-area.json +4 -2
- package/manifest/components/color-field.json +14 -0
- package/manifest/components/color-picker.json +14 -0
- package/manifest/components/color-slider.json +3 -1
- package/manifest/components/colors-section.json +9 -1
- package/manifest/components/combobox.json +49 -1
- package/manifest/components/command-palette.json +37 -1
- package/manifest/components/composer-actions.json +3 -0
- package/manifest/components/composer-attach-button.json +3 -0
- package/manifest/components/composer-attachment-chip.json +3 -0
- package/manifest/components/composer-attachments.json +3 -0
- package/manifest/components/composer-bar.json +3 -0
- package/manifest/components/composer-command-item.json +3 -0
- package/manifest/components/composer-context.json +3 -0
- package/manifest/components/composer-input.json +3 -0
- package/manifest/components/composer-menu-item.json +3 -0
- package/manifest/components/composer-menu.json +3 -0
- package/manifest/components/composer-model-item.json +3 -0
- package/manifest/components/composer-model-trigger.json +3 -0
- package/manifest/components/composer-person-item.json +3 -0
- package/manifest/components/composer-send.json +3 -0
- package/manifest/components/composer-toolbar.json +3 -0
- package/manifest/components/composer-voice-button.json +3 -0
- package/manifest/components/composer-voice.json +3 -0
- package/manifest/components/composer.json +14 -0
- package/manifest/components/confidence-marker.json +3 -1
- package/manifest/components/container.json +2 -1
- package/manifest/components/context-menu.json +38 -1
- package/manifest/components/conversation-search.json +3 -1
- package/manifest/components/cue-mark.json +2 -2
- package/manifest/components/cue-portal-frame.json +1 -1
- package/manifest/components/data-row.json +3 -1
- package/manifest/components/data-tree.json +3 -1
- package/manifest/components/date-field.json +14 -0
- package/manifest/components/date-picker.json +14 -0
- package/manifest/components/date-range-picker.json +14 -0
- package/manifest/components/delegation-card.json +3 -1
- package/manifest/components/density.json +21 -7
- package/manifest/components/description-list.json +6 -1
- package/manifest/components/dialog.json +39 -1
- package/manifest/components/disclosure.json +13 -2
- package/manifest/components/dmx-bar.json +37 -1
- package/manifest/components/dmx-strip.json +37 -1
- package/manifest/components/drawer.json +38 -1
- package/manifest/components/dropdown-menu.json +38 -1
- package/manifest/components/edit-message.json +3 -1
- package/manifest/components/elements-command-palette.json +3 -1
- package/manifest/components/elements-composer.json +3 -0
- package/manifest/components/empty-state-composer.json +3 -1
- package/manifest/components/empty-state-greeting.json +3 -1
- package/manifest/components/empty-state-suggestion.json +3 -1
- package/manifest/components/empty-state-suggestions.json +3 -1
- package/manifest/components/env-var-input.json +14 -1
- package/manifest/components/export-dialog.json +6 -1
- package/manifest/components/eyebrow.json +13 -2
- package/manifest/components/feedback-dialog.json +3 -0
- package/manifest/components/field-description.json +14 -0
- package/manifest/components/field-error.json +14 -0
- package/manifest/components/field-label.json +15 -1
- package/manifest/components/field.json +14 -0
- package/manifest/components/file-upload.json +3 -0
- package/manifest/components/footer.json +14 -1
- package/manifest/components/frames.json +14 -1
- package/manifest/components/hover-card.json +38 -1
- package/manifest/components/info-tip.json +3 -0
- package/manifest/components/input-group.json +14 -0
- package/manifest/components/input.json +14 -0
- package/manifest/components/item.json +3 -1
- package/manifest/components/kbd.json +10 -1
- package/manifest/components/ledger.json +9 -2
- package/manifest/components/link.json +10 -0
- package/manifest/components/log-viewer.json +10 -0
- package/manifest/components/map-answer.json +3 -1
- package/manifest/components/markdown-text.json +3 -0
- package/manifest/components/menubar.json +41 -2
- package/manifest/components/message-list.json +10 -0
- package/manifest/components/message.json +6 -1
- package/manifest/components/mobile-composer.json +3 -1
- package/manifest/components/multi-select.json +49 -1
- package/manifest/components/musical-time-input.json +14 -0
- package/manifest/components/navigation-menu.json +41 -1
- package/manifest/components/node-card.json +3 -0
- package/manifest/components/number-field.json +14 -1
- package/manifest/components/otp-field.json +13 -0
- package/manifest/components/page-shell.json +14 -0
- package/manifest/components/pagination.json +3 -0
- package/manifest/components/panel-header.json +12 -0
- package/manifest/components/panel.json +13 -1
- package/manifest/components/password-input.json +14 -1
- package/manifest/components/permission-scopes.json +3 -1
- package/manifest/components/piano-keyboard.json +3 -0
- package/manifest/components/popover.json +39 -1
- package/manifest/components/preset-section.json +9 -1
- package/manifest/components/preview.json +30 -10
- package/manifest/components/progress.json +6 -1
- package/manifest/components/prompt-library.json +3 -1
- package/manifest/components/queue-dock.json +3 -1
- package/manifest/components/radio-group.json +8 -0
- package/manifest/components/radio.json +8 -0
- package/manifest/components/rating.json +4 -1
- package/manifest/components/reasoning-panel.json +3 -1
- package/manifest/components/recommendation-card.json +1 -1
- package/manifest/components/resizable.json +4 -1
- package/manifest/components/revert-dock.json +3 -1
- package/manifest/components/row.json +5 -1
- package/manifest/components/scroll-area.json +4 -2
- package/manifest/components/scrollable-tabs-list.json +19 -0
- package/manifest/components/scrub-input.json +14 -1
- package/manifest/components/seam-cell.json +1 -0
- package/manifest/components/seam-grid.json +1 -0
- package/manifest/components/seam-list.json +5 -1
- package/manifest/components/search-input.json +14 -1
- package/manifest/components/section-header.json +15 -2
- package/manifest/components/segmented-control.json +17 -0
- package/manifest/components/select.json +28 -0
- package/manifest/components/settings-panel.json +3 -0
- package/manifest/components/shape-section.json +9 -1
- package/manifest/components/sheet.json +38 -1
- package/manifest/components/shimmer-label.json +3 -0
- package/manifest/components/sidebar.json +19 -2
- package/manifest/components/slider.json +8 -0
- package/manifest/components/sources.json +3 -1
- package/manifest/components/stat.json +9 -0
- package/manifest/components/status-bar.json +4 -0
- package/manifest/components/stepper.json +8 -0
- package/manifest/components/swap-label.json +3 -0
- package/manifest/components/switch.json +8 -0
- package/manifest/components/table-scroll-region.json +20 -2
- package/manifest/components/table.json +20 -2
- package/manifest/components/tabs.json +20 -1
- package/manifest/components/tags-input.json +49 -1
- package/manifest/components/terminal-frame.json +3 -0
- package/manifest/components/textarea.json +16 -0
- package/manifest/components/theme-configurator.json +38 -1
- package/manifest/components/theme-provider.json +37 -19
- package/manifest/components/thread-search.json +3 -1
- package/manifest/components/threshold-rail.json +3 -0
- package/manifest/components/time-field.json +14 -0
- package/manifest/components/toast.json +39 -0
- package/manifest/components/toggle-group.json +1 -19
- package/manifest/components/toggle.json +3 -5
- package/manifest/components/token-editor.json +6 -1
- package/manifest/components/tool-call-card.json +9 -2
- package/manifest/components/tool-call.json +3 -1
- package/manifest/components/tool-timeline.json +3 -1
- package/manifest/components/toolbar.json +4 -1
- package/manifest/components/tooltip.json +40 -1
- package/manifest/components/tree-visibility-toggle.json +3 -0
- package/manifest/components/tree.json +3 -0
- package/manifest/components/universe-grid.json +3 -0
- package/manifest/components/voice-conversation.json +3 -0
- package/manifest/components/work-collapse.json +3 -1
- package/manifest/manifest.json +205 -185
- package/manifest/tokens.json +260 -4
- package/package.json +6 -6
package/dist/primitives/kbd.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { cn } from "../lib/cn.js";
|
|
2
|
+
import { CONTROL_FACE } from "../system/_style-control-face.js";
|
|
3
|
+
import { LABEL_WEIGHT } from "../system/_style-label-weight.js";
|
|
4
|
+
import { KBD_BOX, KBD_EDGE, KBD_SIZE } from "../system/_style-kbd.js";
|
|
2
5
|
import * as React from "react";
|
|
3
6
|
import { jsx } from "react/jsx-runtime";
|
|
4
7
|
//#region src/primitives/kbd.tsx
|
|
@@ -9,13 +12,19 @@ import { jsx } from "react/jsx-runtime";
|
|
|
9
12
|
* chip height so a `Kbd` and a `Chip` line up on the same row, and set in the
|
|
10
13
|
* micro type step because shortcut hints are reference material, not content.
|
|
11
14
|
*
|
|
15
|
+
* A key label is a control's voice, so it wears the control face
|
|
16
|
+
* (`--cue-style-control-face`, mono by default) rather than a fixed mono
|
|
17
|
+
* (spec 2026-09-26-looks-fidelity F-16), and a style set can move its rim
|
|
18
|
+
* (`--cue-style-kbd-edge`), its size (`--cue-style-chip-size`, shared with the
|
|
19
|
+
* chip it sits beside) and its weight (`--cue-style-label-weight`).
|
|
20
|
+
*
|
|
12
21
|
* @example
|
|
13
22
|
* <span>Press <Kbd>⌘</Kbd><Kbd>K</Kbd> to search</span>
|
|
14
23
|
*/
|
|
15
24
|
const Kbd = React.forwardRef(function Kbd({ className, children, ...elementProps }, ref) {
|
|
16
25
|
return /* @__PURE__ */ jsx("kbd", {
|
|
17
26
|
ref,
|
|
18
|
-
className: cn(
|
|
27
|
+
className: cn(`inline-flex ${KBD_BOX} select-none items-center justify-center border bg-surface-2 text-fg-muted`, KBD_EDGE, CONTROL_FACE, KBD_SIZE, "leading-none", LABEL_WEIGHT, className),
|
|
19
28
|
...elementProps,
|
|
20
29
|
children
|
|
21
30
|
});
|
|
@@ -19,7 +19,7 @@ const Skeleton = React.forwardRef(function Skeleton({ className, ...elementProps
|
|
|
19
19
|
return /* @__PURE__ */ jsx("div", {
|
|
20
20
|
ref,
|
|
21
21
|
"aria-hidden": "true",
|
|
22
|
-
className: cn("animate-pulse rounded-
|
|
22
|
+
className: cn("animate-pulse rounded-control bg-surface-2 motion-reduce:animate-none", className),
|
|
23
23
|
...elementProps
|
|
24
24
|
});
|
|
25
25
|
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/system/_focus-ring-field.ts
|
|
2
|
+
/**
|
|
3
|
+
* `FOCUS_RING_INSET` (`_focus-ring.ts`) with its offset read from the style set: the
|
|
4
|
+
* recessed field chassis's ring (`forms/_chassis.ts`), and nothing else.
|
|
5
|
+
*
|
|
6
|
+
* Plan V.2, T25: Tender's field ring sits flush on the rim (`0px`) where every
|
|
7
|
+
* other site of the inset shape keeps its `-1px`, so the offset is a name of
|
|
8
|
+
* its own — `style-field-focus-offset`, falling back to the `-1px`
|
|
9
|
+
* `FOCUS_RING_INSET` draws — and not `style-focus-offset`, which is the
|
|
10
|
+
* button chassis's (kiln pulls that to `-1px`, and a field that followed it
|
|
11
|
+
* would move with the buttons). `FOCUS_RING_INSET` keeps its fixed offset
|
|
12
|
+
* for its ten other consumers.
|
|
13
|
+
*
|
|
14
|
+
* Its own module, not a constant in `_focus-ring.ts`: docgen attributes a
|
|
15
|
+
* token to a component by the file its class string lives in, and every
|
|
16
|
+
* focusable component imports that module.
|
|
17
|
+
*
|
|
18
|
+
* @internal Not part of the public API.
|
|
19
|
+
*/
|
|
20
|
+
const FOCUS_RING_FIELD = "focus-visible:outline-solid focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] focus-visible:outline-(--cue-focus) focus-visible:outline-offset-[var(--cue-style-field-focus-offset,-1px)]";
|
|
21
|
+
/**
|
|
22
|
+
* `FOCUS_RING_GROUP_INSET` with {@link FOCUS_RING_FIELD}'s offset: the
|
|
23
|
+
* grouped field's ring reads `style-field-focus-offset` as the field it wraps
|
|
24
|
+
* does (plan V.2, T25), so a grouped field and a plain one keep one focus
|
|
25
|
+
* geometry under every Look.
|
|
26
|
+
*/
|
|
27
|
+
const FOCUS_RING_GROUP_FIELD = "has-focus-visible:outline-solid has-focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] has-focus-visible:outline-(--cue-focus) has-focus-visible:outline-offset-[var(--cue-style-field-focus-offset,-1px)]";
|
|
28
|
+
//#endregion
|
|
29
|
+
export { FOCUS_RING_FIELD, FOCUS_RING_GROUP_FIELD };
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
//#region src/system/_focus-ring.ts
|
|
2
|
+
/**
|
|
3
|
+
* The one focus ring this library draws, in one place.
|
|
4
|
+
*
|
|
5
|
+
* Spec 2026-09-26-looks-fidelity §3.12 (F-9). Before this module existed, 80
|
|
6
|
+
* files each spelt out `focus-visible:outline-2 focus-visible:outline-solid
|
|
7
|
+
* focus-visible:outline-offset-<n> focus-visible:outline-accent` by hand — a
|
|
8
|
+
* fixed 2px ring in the theme's **brand** colour. That is the wrong role:
|
|
9
|
+
* `--cue-accent` is not contrast-gated as an indicator, `--cue-focus` is (WCAG
|
|
10
|
+
* 1.4.11, advisory 3:1 on five grounds — `forms/_chassis.ts` carries the long
|
|
11
|
+
* form), and three shipped presets (hivehub.light, luma.light, venu.light)
|
|
12
|
+
* already had to split the two apart because the accent alone reads under
|
|
13
|
+
* 3:1 there. Every site but `forms/_chassis.ts` kept pointing at the
|
|
14
|
+
* un-gated role anyway, which is the defect this module closes.
|
|
15
|
+
*
|
|
16
|
+
* **This is a deliberate, library-wide colour change**, not a no-op: the
|
|
17
|
+
* ring's colour moves wherever a theme's `focus` differs from its `accent` —
|
|
18
|
+
* graphite and kiln and porcelain in both modes, tender dark, and hivehub,
|
|
19
|
+
* luma and venu in light (ten of the thirty theme blocks this system ships).
|
|
20
|
+
* `tests/browser/form-focus.spec.ts` and `form-focus-theme-blocks.spec.ts`
|
|
21
|
+
* measure the ring's resolved colour against `--cue-focus` in every one of
|
|
22
|
+
* the thirty.
|
|
23
|
+
*
|
|
24
|
+
* **Width is a style-set knob, colour is not.** `--cue-style-focus-width`
|
|
25
|
+
* lets a Look draw a heavier ring (tender: 3px) without a second module; no
|
|
26
|
+
* style name touches the ink, because the ink's job is the contrast floor,
|
|
27
|
+
* not the Look's voice. The fallback is `--cue-focus-ring`, the frozen 2px
|
|
28
|
+
* this system drew before any style set existed.
|
|
29
|
+
*
|
|
30
|
+
* **Offset is not one of the constants below.** Every site but the button
|
|
31
|
+
* chassis keeps the exact offset it already painted — `FOCUS_RING` (1px,
|
|
32
|
+
* floating clear of the edge), `FOCUS_RING_INSET` (-1px, flush with it),
|
|
33
|
+
* `FOCUS_RING_INSET_2` (-2px, flush one rung further in) and
|
|
34
|
+
* `FOCUS_RING_OFFSET_2` (2px, floating two clear) between them cover every
|
|
35
|
+
* offset this library drew before this file existed but one: `buttonChassis`
|
|
36
|
+
* reads `--cue-style-focus-offset` directly (kiln pulls it to -1px), so
|
|
37
|
+
* `FOCUS_RING_PAINT` — the width-and-colour half with no offset of its own —
|
|
38
|
+
* is exported for that one call site to finish.
|
|
39
|
+
*
|
|
40
|
+
* **Every export is a complete, literal string, not built from parts at
|
|
41
|
+
* runtime.** A first draft of this file built each one from a shared
|
|
42
|
+
* `ring(modifier, offset)` helper — the exact same characters, byte for byte,
|
|
43
|
+
* as what is written out below. It compiled, every jsdom suite that reads
|
|
44
|
+
* class strings off a render stayed green, and every rendered `className`
|
|
45
|
+
* carried the right text — and in a real browser the ring's `outline-offset`
|
|
46
|
+
* computed `0px` on all eighty sites regardless of which constant they used.
|
|
47
|
+
* `@tailwindcss/oxide` finds a utility by scanning source *text* for a
|
|
48
|
+
* complete candidate, and never evaluates the template literal that would
|
|
49
|
+
* assemble `"focus-visible" + ":" + "-outline-offset-1"` at runtime — so a
|
|
50
|
+
* class no file spells out in one contiguous string is a class the compiler
|
|
51
|
+
* never generates, however many test suites confirm the DOM carries its
|
|
52
|
+
* name. `tests/browser/form-focus.spec.ts` is what caught it, on a full
|
|
53
|
+
* `pnpm test:browser` run rather than on any file run alone, which is the
|
|
54
|
+
* argument for never letting this module drift back to the helper.
|
|
55
|
+
*
|
|
56
|
+
* **Its own module**, for the reason `_paint-glow.ts` gives at length:
|
|
57
|
+
* `@repo/docgen` attributes a token to a component by the file its class
|
|
58
|
+
* string lives in, following only `_`-prefixed imports. One ring, spent from
|
|
59
|
+
* one file, so a component that draws it is credited with reading
|
|
60
|
+
* `--cue-focus` and not with reading nothing.
|
|
61
|
+
*
|
|
62
|
+
* `outline-solid` is load-bearing in every export below, not decoration: in
|
|
63
|
+
* Tailwind v4 an outline's *style* is a separate custom property from its
|
|
64
|
+
* width, `outline-none` (the resting state every one of these sites also
|
|
65
|
+
* carries) sets that property to `none`, and only `<modifier>:outline-solid`
|
|
66
|
+
* restores it at ring time. `buttonChassis`'s own note says why at more
|
|
67
|
+
* length; `test/focus-ring.test.ts` is what keeps it paired here.
|
|
68
|
+
*
|
|
69
|
+
* @internal Not part of the public API.
|
|
70
|
+
*/
|
|
71
|
+
/**
|
|
72
|
+
* The ring's width and colour, with no offset of its own.
|
|
73
|
+
*
|
|
74
|
+
* Exported only for `primitives/button.tsx`, whose offset is itself a
|
|
75
|
+
* style-set knob (`--cue-style-focus-offset`) rather than one of the four
|
|
76
|
+
* fixed shapes below. Every other site imports one of those instead.
|
|
77
|
+
*/
|
|
78
|
+
const FOCUS_RING_PAINT = "focus-visible:outline-solid focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] focus-visible:outline-(--cue-focus)";
|
|
79
|
+
/**
|
|
80
|
+
* A ring floating one pixel clear of the control's own edge
|
|
81
|
+
* (`outline-offset-1`).
|
|
82
|
+
*
|
|
83
|
+
* The shape most of this system's non-recessed controls drew already —
|
|
84
|
+
* `Button`'s siblings that do not ride `buttonChassis` itself, `Chip`,
|
|
85
|
+
* `Tabs`' own trigger, `AppBar.Link` and the rest of the plain chrome.
|
|
86
|
+
*/
|
|
87
|
+
const FOCUS_RING = "focus-visible:outline-solid focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] focus-visible:outline-(--cue-focus) focus-visible:outline-offset-1";
|
|
88
|
+
/**
|
|
89
|
+
* A ring pulled back flush with the control's own edge, one pixel in
|
|
90
|
+
* (`-outline-offset-1`).
|
|
91
|
+
*
|
|
92
|
+
* The recessed-chassis shape: an outline at this offset spans from one pixel
|
|
93
|
+
* inside the border box to one pixel outside it, so it covers the rim it is
|
|
94
|
+
* drawn over instead of floating clear of it — `forms/_chassis.ts`'s long
|
|
95
|
+
* comment is the argument in full, and that file's own ring is exactly this
|
|
96
|
+
* constant.
|
|
97
|
+
*/
|
|
98
|
+
const FOCUS_RING_INSET = "focus-visible:outline-solid focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] focus-visible:outline-(--cue-focus) focus-visible:-outline-offset-1";
|
|
99
|
+
/**
|
|
100
|
+
* A ring pulled back two pixels (`-outline-offset-2`) — for a control whose
|
|
101
|
+
* own rim sits one ring further in than {@link FOCUS_RING_INSET}'s, such as
|
|
102
|
+
* `SegmentedControl`'s pressed item inside its track.
|
|
103
|
+
*/
|
|
104
|
+
const FOCUS_RING_INSET_2 = "focus-visible:outline-solid focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] focus-visible:outline-(--cue-focus) focus-visible:-outline-offset-2";
|
|
105
|
+
/**
|
|
106
|
+
* A ring floating two pixels clear (`outline-offset-2`) — the wider-gap
|
|
107
|
+
* counterpart to {@link FOCUS_RING} for a control with more room around it,
|
|
108
|
+
* such as a `Tabs` list item or a card-level link.
|
|
109
|
+
*/
|
|
110
|
+
const FOCUS_RING_OFFSET_2 = "focus-visible:outline-solid focus-visible:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] focus-visible:outline-(--cue-focus) focus-visible:outline-offset-2";
|
|
111
|
+
/**
|
|
112
|
+
* The one ring in this module drawn from a `data-*` attribute instead of a
|
|
113
|
+
* pseudo-class, floating two pixels clear (`outline-offset-2`).
|
|
114
|
+
*
|
|
115
|
+
* `color/_thumb.ts`'s draggable colour puck sits on Base UI's `ColorArea` and
|
|
116
|
+
* `ColorSlider`, which stamp `data-focus-visible` on the thumb rather than
|
|
117
|
+
* leaving `:focus-visible` to match it directly — so the thumb reads it as
|
|
118
|
+
* `data-[focus-visible]:`, the one modifier spelling this module exists to
|
|
119
|
+
* unify away from and cannot: `test/focus-ring.test.ts`'s WCAG guard has to
|
|
120
|
+
* see this exact string too, which is why it is spelled out here rather than
|
|
121
|
+
* composed at the call site.
|
|
122
|
+
*/
|
|
123
|
+
const FOCUS_RING_DATA_OFFSET_2 = "data-[focus-visible]:outline-solid data-[focus-visible]:outline-[length:var(--cue-style-focus-width,var(--cue-focus-ring))] data-[focus-visible]:outline-(--cue-focus) data-[focus-visible]:outline-offset-2";
|
|
124
|
+
//#endregion
|
|
125
|
+
export { FOCUS_RING, FOCUS_RING_DATA_OFFSET_2, FOCUS_RING_INSET, FOCUS_RING_INSET_2, FOCUS_RING_OFFSET_2, FOCUS_RING_PAINT };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/system/_paint-elevation.ts
|
|
2
|
+
/**
|
|
3
|
+
* An overlay. Its default MUST render `0 8px 24px rgba(0,0,0,0.4)` — the literal
|
|
4
|
+
* at four call sites — which is why `--cue-paint-shade-far` is the one
|
|
5
|
+
* non-transparent shadow ink. Measured pixel-identical to it.
|
|
6
|
+
*/
|
|
7
|
+
const ELEVATION_2 = "shadow-[0_0_0_var(--cue-paint-rim-width)_var(--cue-paint-shade-hairline,transparent),0_calc(2px*var(--cue-paint-shadow-scale))_calc(6px*var(--cue-paint-shadow-scale))_var(--cue-paint-shadow-spread)_var(--cue-paint-shade-near,transparent),0_calc(8px*var(--cue-paint-shadow-scale))_calc(24px*var(--cue-paint-shadow-scale))_var(--cue-paint-shadow-spread)_var(--cue-paint-shade-far,rgba(0,0,0,0.4)),inset_0_1px_0_0_var(--cue-paint-sheen-ink,transparent)]";
|
|
8
|
+
//#endregion
|
|
9
|
+
export { ELEVATION_2 };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//#region src/system/_paint-glass.ts
|
|
2
|
+
/**
|
|
3
|
+
* Translucency, with the opaque twin every glass rule needs.
|
|
4
|
+
*
|
|
5
|
+
* **Why this writes `--tw-backdrop-blur` instead of `backdrop-filter`.** Spec
|
|
6
|
+
* §13.5, decided on measurements. Tailwind composes every backdrop utility into
|
|
7
|
+
* ONE declaration — `backdrop-filter: var(--tw-backdrop-blur,)
|
|
8
|
+
* var(--tw-backdrop-brightness,) …` — so a raw `[backdrop-filter:var(…)]` here
|
|
9
|
+
* is a second, competing declaration. Measured: a consumer passing
|
|
10
|
+
* `backdrop-brightness-50` through `className` then computes
|
|
11
|
+
* `brightness(0.5)` and **no blur at all**. The glass does not narrow, it
|
|
12
|
+
* disappears, silently.
|
|
13
|
+
*
|
|
14
|
+
* Filling Tailwind's own slot keeps the composition: the default computes
|
|
15
|
+
* `blur(8px)`, a consumer's brightness composes onto it, and a pack's
|
|
16
|
+
* `blur(12px) saturate(1.4)` survives whole — which a length-valued
|
|
17
|
+
* `backdrop-blur-(--name)` could not express at all.
|
|
18
|
+
*
|
|
19
|
+
* **`backdrop-saturate-100` is there to make the composed declaration exist**,
|
|
20
|
+
* and the choice of utility is load-bearing. Filling a slot paints nothing
|
|
21
|
+
* unless something emits the `backdrop-filter` that reads the slots, and only a
|
|
22
|
+
* backdrop utility emits it. `backdrop-blur-none` would have done that — and it
|
|
23
|
+
* writes `--tw-backdrop-blur` itself, so whichever of the two came later in the
|
|
24
|
+
* stylesheet won: measured, with `blur-none` last the glass computes `none` and
|
|
25
|
+
* disappears. `backdrop-saturate-100` writes a different slot, so the two cannot
|
|
26
|
+
* race, and `saturate(1)` is the identity filter.
|
|
27
|
+
*
|
|
28
|
+
* **The cost is naming an internal, and it is pinned rather than accepted.**
|
|
29
|
+
* `test/system/paint-glass.test.ts` asks the Tailwind compiler what
|
|
30
|
+
* `backdrop-blur` emits and asserts the variable name against that answer, so a
|
|
31
|
+
* rename fails loudly instead of the glass quietly ceasing to compose.
|
|
32
|
+
*
|
|
33
|
+
* **The fill is an explicit `background-color`, not `bg-(--name)`.** The
|
|
34
|
+
* shorthand has nowhere to put the `var()` fallback an ink requires, and an ink
|
|
35
|
+
* spent without one leaves the declaration invalid and CSS drops it in silence.
|
|
36
|
+
*
|
|
37
|
+
* **The `@supports` twin is not decoration.** A browser without
|
|
38
|
+
* `backdrop-filter` paints the translucent fill over whatever is behind it and
|
|
39
|
+
* the bar becomes unreadable; the fallback ink is the opaque surface it would
|
|
40
|
+
* have had.
|
|
41
|
+
*
|
|
42
|
+
* @internal Not part of the public API.
|
|
43
|
+
*/
|
|
44
|
+
const GLASS_CLASSES = "[--tw-backdrop-blur:var(--cue-paint-glass-filter,blur(8px))] backdrop-saturate-100 [background-color:var(--cue-paint-glass-ink,color-mix(in_oklch,var(--cue-surface-1)_95%,transparent))] [@supports_not_(backdrop-filter:blur(0px))]:[background-color:var(--cue-paint-glass-fallback-ink,var(--cue-surface-1))]";
|
|
45
|
+
//#endregion
|
|
46
|
+
export { GLASS_CLASSES };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
//#region src/system/_paint-glow.ts
|
|
2
|
+
/**
|
|
3
|
+
* The halo: two offsetless stops at rest, two more on hover.
|
|
4
|
+
*
|
|
5
|
+
* **Offsetless is the rule that keeps this name from being `elevation` twice.**
|
|
6
|
+
* A drop shadow has a y-offset and reads as light from above; a halo has none
|
|
7
|
+
* and reads as the element emitting. The build refuses a glow value with an
|
|
8
|
+
* offset for that reason, with a positive control that must throw.
|
|
9
|
+
*
|
|
10
|
+
* **A separate rest and hover ink, not a `calc()` on one.** The corpus doubles
|
|
11
|
+
* the alpha on hover — railway `0.25`→`0.50`, aceternity `0.2`→`0.4` — and one
|
|
12
|
+
* site's three-layer white halo exists *only* on hover. A single ink with a
|
|
13
|
+
* multiplier cannot express the last of those at all.
|
|
14
|
+
*
|
|
15
|
+
* **Its own module**, because `@repo/docgen` attributes a token by the file its
|
|
16
|
+
* class string lives in, including through a type-only import. One device per
|
|
17
|
+
* file; the two ways that bit are recorded in `_paint-elevation.ts`.
|
|
18
|
+
*
|
|
19
|
+
* **Every ink carries its default as a `var()` fallback**, without exception: an
|
|
20
|
+
* ink is declared in no stylesheet, so a spend without one leaves the whole
|
|
21
|
+
* `box-shadow` invalid and CSS drops it in silence — measured, and the reason
|
|
22
|
+
* the elevation rungs and the stroke recipe carry theirs.
|
|
23
|
+
*
|
|
24
|
+
* **Nothing wearing this may also carry a `shadow-` literal**: `twMerge` keeps
|
|
25
|
+
* one of two `shadow-` utilities on the same element. The two tones that wear a
|
|
26
|
+
* halo, `primary` and `danger`, carry no other, which is what makes the
|
|
27
|
+
* adoption additive. The `outline` tone does carry one — `REST_SHADE_CLASS`,
|
|
28
|
+
* the resting shade (fidelity plan R3) — so it must not also take
|
|
29
|
+
* `GLOW_CLASSES`: one of the two would be dropped in silence. A halo there
|
|
30
|
+
* would compose both into one `shadow-[…]` list instead.
|
|
31
|
+
*
|
|
32
|
+
* @internal Not part of the public API.
|
|
33
|
+
*/
|
|
34
|
+
const GLOW_CLASSES = "shadow-[0_0_var(--cue-paint-glow-blur)_var(--cue-paint-glow-ink,transparent),0_0_var(--cue-paint-glow-blur-far)_var(--cue-paint-glow-ink,transparent)] hover:shadow-[0_0_var(--cue-paint-glow-blur)_var(--cue-paint-glow-ink-hover,transparent),0_0_var(--cue-paint-glow-blur-far)_var(--cue-paint-glow-ink-hover,transparent)]";
|
|
35
|
+
/**
|
|
36
|
+
* The danger variant of {@link GLOW_CLASSES} (spec §3.10, P0.6): the same two
|
|
37
|
+
* offsetless stops, at the same two blur radii, tinted by the danger tone's
|
|
38
|
+
* own ink — `paint-danger-glow-ink` — rather than by the halo's. One ink, not
|
|
39
|
+
* a rest/hover pair: no pack authors a danger-glow HOVER ink, so `buttonTones`'
|
|
40
|
+
* `danger` reads one value at both states, exactly as it reads `bg-danger`
|
|
41
|
+
* without a separate hover fill.
|
|
42
|
+
*
|
|
43
|
+
* `transparent` by default, on every shipped pack but glaze, which is what
|
|
44
|
+
* keeps this additive: `buttonTones.danger` carries no `shadow-` literal
|
|
45
|
+
* today, so adopting this changes nothing until a pack tints the ink.
|
|
46
|
+
*
|
|
47
|
+
* @internal Not part of the public API.
|
|
48
|
+
*/
|
|
49
|
+
const GLOW_DANGER_CLASSES = "shadow-[0_0_var(--cue-paint-glow-blur)_var(--cue-paint-danger-glow-ink,transparent),0_0_var(--cue-paint-glow-blur-far)_var(--cue-paint-danger-glow-ink,transparent)]";
|
|
50
|
+
//#endregion
|
|
51
|
+
export { GLOW_CLASSES, GLOW_DANGER_CLASSES };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//#region src/system/_paint-ground-pattern.ts
|
|
2
|
+
/**
|
|
3
|
+
* A repeating pattern on a page-level ground.
|
|
4
|
+
*
|
|
5
|
+
* **Distinct from a texture, and the difference is the layer.** A texture is
|
|
6
|
+
* noise on a pseudo-element *over* the host (`_paint-texture.ts`); a ground
|
|
7
|
+
* pattern is a repeating geometry painted as the host's own `background-image`,
|
|
8
|
+
* beneath its content and beside its `background-color`. A page can carry both:
|
|
9
|
+
* a hatch under a grain.
|
|
10
|
+
*
|
|
11
|
+
* **It sets `background-image`, so a host that paints its own image cannot take
|
|
12
|
+
* it.** The two adopting surfaces paint a `background-color` only.
|
|
13
|
+
*
|
|
14
|
+
* **Its own module**, because `@repo/docgen` attributes a token by the file its
|
|
15
|
+
* class string lives in, including through a type-only import.
|
|
16
|
+
*
|
|
17
|
+
* **The ink is spent by the pack's own image, not here.** A pattern is a whole
|
|
18
|
+
* CSS `<image>` a pack writes, and `--cue-paint-ground-pattern-ink` is the name
|
|
19
|
+
* that image references — which is why §4 documents these four image slots as
|
|
20
|
+
* freezing their ink at the element the pack block sits on, and why they are
|
|
21
|
+
* page-level devices where that costs nothing measurable.
|
|
22
|
+
*
|
|
23
|
+
* At the default `--cue-paint-ground-pattern` is `none`, so the host paints
|
|
24
|
+
* exactly what it painted before.
|
|
25
|
+
*
|
|
26
|
+
* @internal Not part of the public API.
|
|
27
|
+
*/
|
|
28
|
+
const GROUND_PATTERN_CLASSES = "bg-[image:var(--cue-paint-ground-pattern)] bg-[length:var(--cue-paint-ground-pattern-size)]";
|
|
29
|
+
//#endregion
|
|
30
|
+
export { GROUND_PATTERN_CLASSES };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//#region src/system/_paint-rest-shade.ts
|
|
2
|
+
/**
|
|
3
|
+
* {@link REST_SHADE} as a utility of its own, for a site that has no shadow
|
|
4
|
+
* list to compose it into: the recessed input chassis (`forms/_chassis.ts`,
|
|
5
|
+
* whose stroke recipe paints a border and a ground and no shadow), the
|
|
6
|
+
* outline button tone and the checkbox box (fidelity plan R3).
|
|
7
|
+
*
|
|
8
|
+
* **Spelt out, character for character**, rather than built from
|
|
9
|
+
* `REST_SHADE` with its spaces turned to underscores: `@tailwindcss/oxide`
|
|
10
|
+
* finds a utility by scanning source text for a complete candidate and never
|
|
11
|
+
* evaluates a template literal, so a class assembled at runtime is a class no
|
|
12
|
+
* stylesheet contains (`_focus-ring.ts` records the time that shipped).
|
|
13
|
+
* `test/system/style-controls.test.tsx` holds the two spellings together.
|
|
14
|
+
*
|
|
15
|
+
* **Labelled `shadow:`**, which Tailwind compiles exactly as it compiles the
|
|
16
|
+
* unlabelled value. The label is for `twMerge`, which knows a shadow only by
|
|
17
|
+
* two plain lengths after the `[` — this value's second is a `calc()` — and
|
|
18
|
+
* without the label files the class as a shadow COLOUR: a caller's
|
|
19
|
+
* `className="shadow-lg"` would then survive beside it rather than replace
|
|
20
|
+
* it, and a caller's `shadow-red-500` would delete it. Labelled, a caller's
|
|
21
|
+
* shadow replaces it and a caller's shadow colour tints it, as with any
|
|
22
|
+
* Tailwind shadow.
|
|
23
|
+
*
|
|
24
|
+
* **A site that already carries a `shadow-` utility must not take this**:
|
|
25
|
+
* `twMerge` keeps one of two `shadow-` utilities on the same element. It
|
|
26
|
+
* composes `REST_SHADE` into its own list instead.
|
|
27
|
+
*
|
|
28
|
+
* @internal Not part of the public API.
|
|
29
|
+
*/
|
|
30
|
+
const REST_SHADE_CLASS = "shadow-[shadow:0_calc(2px*var(--cue-paint-shadow-scale))_calc(4px*var(--cue-paint-shadow-scale))_var(--cue-paint-rest-shade,transparent)]";
|
|
31
|
+
//#endregion
|
|
32
|
+
export { REST_SHADE_CLASS };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
//#region src/system/_paint-rim.ts
|
|
2
|
+
/**
|
|
3
|
+
* An inset ring on a surface that carries no shadow of its own.
|
|
4
|
+
*
|
|
5
|
+
* **A ring, not a border.** It is drawn as an inset `box-shadow`, outside the
|
|
6
|
+
* box model, so it costs no layout and sits inside the surface's radius. That
|
|
7
|
+
* is what lets a pack put a hairline of light on a panel without moving a
|
|
8
|
+
* single pixel of content.
|
|
9
|
+
*
|
|
10
|
+
* **NOT the recessed control chassis**, and that is an accessibility rule
|
|
11
|
+
* rather than a preference. `forced-colors: active` discards `box-shadow`
|
|
12
|
+
* entirely and repaints outlines in the user's own highlight colour, so a ring
|
|
13
|
+
* drawn as a shadow vanishes for exactly the people who most need it — and a
|
|
14
|
+
* form control's ring is a focus indicator. `forms/chassis.test.ts` asserts
|
|
15
|
+
* that the one shadow `controlSurface` carries is the resting shade
|
|
16
|
+
* (`REST_SHADE_CLASS`, fidelity plan R3) and that nothing else in it is a
|
|
17
|
+
* shadow or a ring, and it is right to: the shade is decorative and
|
|
18
|
+
* unconditional, no part of the focus indicator, so losing it to
|
|
19
|
+
* `forced-colors` loses nothing a person needs. §22's inventory lists
|
|
20
|
+
* `_chassis.ts:101` as a rim site; it is wrong, and the guard predates it.
|
|
21
|
+
*
|
|
22
|
+
* A panel's or a card's rim is decorative, so the same loss is cosmetic there.
|
|
23
|
+
*
|
|
24
|
+
* **Nothing already carrying a `shadow-` utility may take this**, because
|
|
25
|
+
* `twMerge` keeps one of two on the same element. The three adopting surfaces
|
|
26
|
+
* were checked and carry none; an elevated surface gets its ring as the
|
|
27
|
+
* hairline *layer* of `ELEVATION_*` instead, which is what that layer is for.
|
|
28
|
+
*
|
|
29
|
+
* **Its own module**, because `@repo/docgen` attributes a token by the file its
|
|
30
|
+
* class string lives in, including through a type-only import.
|
|
31
|
+
*
|
|
32
|
+
* **The ink carries its default as a `var()` fallback**: an ink is declared in
|
|
33
|
+
* no stylesheet, so a spend without one leaves the whole `box-shadow` invalid
|
|
34
|
+
* and CSS drops it in silence — measured twice in earlier slices, once costing
|
|
35
|
+
* an element its border and its fill together.
|
|
36
|
+
*
|
|
37
|
+
* At the defaults `--cue-paint-rim-width` is `0px` and the ink is
|
|
38
|
+
* `transparent`, so the ring is a no-op twice over.
|
|
39
|
+
*
|
|
40
|
+
* **The resting shade rides in the same list** (spec 2026-09-26-looks-fidelity
|
|
41
|
+
* §3.10, `paint-rest-shade`; plan R5). A card and a panel are the two surfaces
|
|
42
|
+
* that spend this ring, and they are two of `REST_SHADE`'s readers: a pack that
|
|
43
|
+
* sets them down on the page with a one-stop contact shadow (glaze, rows P21
|
|
44
|
+
* and P25) tints `--cue-paint-rest-shade`, and every other pack leaves it
|
|
45
|
+
* `transparent`. It is composed here, as the second layer of this one utility,
|
|
46
|
+
* and not beside it, for the reason above — `twMerge` keeps one of two
|
|
47
|
+
* `shadow-` utilities. It is spelt out rather than interpolated from
|
|
48
|
+
* `_paint-rest-shade.ts`, because Tailwind scans the shipped `dist/` for whole
|
|
49
|
+
* class strings and a template literal is not one; `test/system/
|
|
50
|
+
* paint-rim-pattern.test.ts` holds the two spellings to each other. A
|
|
51
|
+
* transparent layer paints nothing, so under every pack but a tinted one this
|
|
52
|
+
* is still the ring alone (`tests/browser/paint-elevation-noop.spec.ts`, by
|
|
53
|
+
* pixels, under all ten).
|
|
54
|
+
*
|
|
55
|
+
* @internal Not part of the public API.
|
|
56
|
+
*/
|
|
57
|
+
const RIM_INSET = "shadow-[inset_0_0_0_var(--cue-paint-rim-width)_var(--cue-paint-rim-ink,transparent),0_calc(2px*var(--cue-paint-shadow-scale))_calc(4px*var(--cue-paint-shadow-scale))_var(--cue-paint-rest-shade,transparent)]";
|
|
58
|
+
//#endregion
|
|
59
|
+
export { RIM_INSET };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/system/_paint-stroke-sunken.ts
|
|
2
|
+
/**
|
|
3
|
+
* The gradient-stroke recipe for a recessed control — the `--cue-sunken` fill.
|
|
4
|
+
*
|
|
5
|
+
* **One fill per module, and that is the point of the file.** `@repo/docgen`
|
|
6
|
+
* attributes a token to a component by the FILE the class string lives in, so a
|
|
7
|
+
* single `_paint.ts` holding all three fills gave every adopting component all
|
|
8
|
+
* three tokens: `card.json` claimed `--cue-sunken` and `--cue-surface-2`, which
|
|
9
|
+
* `Card` does not paint. Measured on the first manifest regeneration of Slice 2;
|
|
10
|
+
* the spec's own risk register predicted it and named this split as the remedy.
|
|
11
|
+
*
|
|
12
|
+
* The recipe itself, and why its off state is a flat gradient rather than
|
|
13
|
+
* `none`, is documented once in `./_paint`.
|
|
14
|
+
*
|
|
15
|
+
* @internal Not part of the public API.
|
|
16
|
+
*/
|
|
17
|
+
const STROKE_SUNKEN = "border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-sunken),var(--cue-sunken)),linear-gradient(var(--cue-paint-stroke-angle),var(--cue-paint-stroke-from,var(--cue-border)),var(--cue-paint-stroke-to,var(--cue-border)))] bg-origin-border [background-clip:padding-box,border-box]";
|
|
18
|
+
//#endregion
|
|
19
|
+
export { STROKE_SUNKEN };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/system/_paint-stroke-surface-1.ts
|
|
2
|
+
/**
|
|
3
|
+
* The gradient-stroke recipe for a card or panel — the `--cue-surface-1` fill.
|
|
4
|
+
*
|
|
5
|
+
* **One fill per module, and that is the point of the file.** `@repo/docgen`
|
|
6
|
+
* attributes a token to a component by the FILE the class string lives in, so a
|
|
7
|
+
* single `_paint.ts` holding all three fills gave every adopting component all
|
|
8
|
+
* three tokens: `card.json` claimed `--cue-sunken` and `--cue-surface-2`, which
|
|
9
|
+
* `Card` does not paint. Measured on the first manifest regeneration of Slice 2;
|
|
10
|
+
* the spec's own risk register predicted it and named this split as the remedy.
|
|
11
|
+
*
|
|
12
|
+
* The recipe itself, and why its off state is a flat gradient rather than
|
|
13
|
+
* `none`, is documented once in `./_paint`.
|
|
14
|
+
*
|
|
15
|
+
* @internal Not part of the public API.
|
|
16
|
+
*/
|
|
17
|
+
const STROKE_SURFACE_1 = "border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-surface-1),var(--cue-surface-1)),linear-gradient(var(--cue-paint-stroke-angle),var(--cue-paint-stroke-raised-from,var(--cue-paint-stroke-from,var(--cue-border))),var(--cue-paint-stroke-raised-to,var(--cue-paint-stroke-to,var(--cue-border))))] bg-origin-border [background-clip:padding-box,border-box]";
|
|
18
|
+
//#endregion
|
|
19
|
+
export { STROKE_SURFACE_1 };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
//#region src/system/_paint-stroke-surface-2.ts
|
|
2
|
+
/**
|
|
3
|
+
* The gradient-stroke recipe for an overlay — the `--cue-surface-2` fill.
|
|
4
|
+
*
|
|
5
|
+
* **One fill per module, and that is the point of the file.** `@repo/docgen`
|
|
6
|
+
* attributes a token to a component by the FILE the class string lives in, so a
|
|
7
|
+
* single `_paint.ts` holding all three fills gave every adopting component all
|
|
8
|
+
* three tokens: `card.json` claimed `--cue-sunken` and `--cue-surface-2`, which
|
|
9
|
+
* `Card` does not paint. Measured on the first manifest regeneration of Slice 2;
|
|
10
|
+
* the spec's own risk register predicted it and named this split as the remedy.
|
|
11
|
+
*
|
|
12
|
+
* **Its stops fall back to `--cue-border-overlay`, not `--cue-border`**, and
|
|
13
|
+
* that is the one place the three fills differ. An overlay has always drawn its
|
|
14
|
+
* rim in `border-overlay`: a distinct token that some themes — venu — match to
|
|
15
|
+
* the surface deliberately so the rim vanishes. Falling back to `--cue-border`
|
|
16
|
+
* here would repaint every dialog, menu, popover and toast in a colour the
|
|
17
|
+
* theme did not choose for them. Caught by the manifest, which showed 22
|
|
18
|
+
* components losing `--cue-border-overlay` the moment this fill was adopted.
|
|
19
|
+
*
|
|
20
|
+
* **Round 2 (spec §3.10, P0.6): the stroke stops read the overlay's own ink,
|
|
21
|
+
* `paint-stroke-overlay-from`/`-to`, not `paint-stroke-from`/`-to` any more.**
|
|
22
|
+
* Every shipped pack still restates its stroke pair here too — `none`'s pair
|
|
23
|
+
* is `var(--cue-border-overlay)`, closing F-10's gap (under `none`, an overlay's
|
|
24
|
+
* edge used to differ from what a page with no pack draws) — so the fallback
|
|
25
|
+
* stays load-bearing only for a THIRD-PARTY pack that has not yet declared the
|
|
26
|
+
* two new names.
|
|
27
|
+
*
|
|
28
|
+
* **The fill reads `style-overlay-ground` (spec §3.11), not a bare
|
|
29
|
+
* `--cue-surface-2` literal.** A style set may pick one of five opaque grounds
|
|
30
|
+
* for an overlay's fill, the same way `band-ground` works one axis over; no
|
|
31
|
+
* set does yet, so the fallback keeps this a no-op everywhere.
|
|
32
|
+
*
|
|
33
|
+
* The recipe itself, and why its off state is a flat gradient rather than
|
|
34
|
+
* `none`, is documented once in `./_paint`.
|
|
35
|
+
*
|
|
36
|
+
* @internal Not part of the public API.
|
|
37
|
+
*/
|
|
38
|
+
const STROKE_SURFACE_2 = "border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-style-overlay-ground,var(--cue-surface-2)),var(--cue-style-overlay-ground,var(--cue-surface-2))),linear-gradient(var(--cue-paint-stroke-angle),var(--cue-paint-stroke-overlay-from,var(--cue-border-overlay)),var(--cue-paint-stroke-overlay-to,var(--cue-border-overlay)))] bg-origin-border [background-clip:padding-box,border-box]";
|
|
39
|
+
//#endregion
|
|
40
|
+
export { STROKE_SURFACE_2 };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
//#region src/system/_paint-texture.ts
|
|
2
|
+
/**
|
|
3
|
+
* A grain or pattern overlay, riding a pseudo-element.
|
|
4
|
+
*
|
|
5
|
+
* **Why `::before` and not the element's own background.** A texture sits *over*
|
|
6
|
+
* whatever the host already paints — a band's ground, a shell's fill — and a
|
|
7
|
+
* component's `background-image` is not free to take. The overlay is
|
|
8
|
+
* `pointer-events-none` and `inset-0`, so it covers the host exactly and
|
|
9
|
+
* intercepts nothing.
|
|
10
|
+
*
|
|
11
|
+
* **Its own module**, because `@repo/docgen` attributes a token by the file its
|
|
12
|
+
* class string lives in, including through a type-only import. One device per
|
|
13
|
+
* file; the two ways that bit are recorded in `_paint-elevation.ts`.
|
|
14
|
+
*
|
|
15
|
+
* **`isolate` and `before:-z-10` together, and neither works alone.** An
|
|
16
|
+
* absolutely-positioned `::before` paints ABOVE its host's in-flow content, so
|
|
17
|
+
* without them the texture covers the band's own text — measured, the white
|
|
18
|
+
* text's brightest pixel drops 255 to 204 under a 60% overlay. `-z-10` alone
|
|
19
|
+
* does not fix it: with no stacking context on the host the pseudo-element
|
|
20
|
+
* falls behind the band's own background and the texture becomes invisible
|
|
21
|
+
* entirely (measured: the ground pixel does not move). `isolate` gives the host
|
|
22
|
+
* a stacking context, and inside one a negative-z child paints above the
|
|
23
|
+
* background and below the content — which is exactly the layer a texture wants.
|
|
24
|
+
* Found in review; the first gate could not see it because its test band had no
|
|
25
|
+
* content in it.
|
|
26
|
+
*
|
|
27
|
+
* **The mask carries its `-webkit-` prefix**, which is the library's
|
|
28
|
+
* convention rather than a guess: `elements/clamp.tsx:223` and
|
|
29
|
+
* `chrome/_edge-scroller.tsx:73` are the only other mask users here and both
|
|
30
|
+
* prefix it. Measured for completeness — Playwright's WebKit honours the
|
|
31
|
+
* unprefixed property, identically to Chromium — so this is for the Safari
|
|
32
|
+
* versions that engine is not, and it matches what the two existing sites
|
|
33
|
+
* already decided. Found in review.
|
|
34
|
+
*
|
|
35
|
+
* **Nothing else in the library may take this pseudo-element on the same
|
|
36
|
+
* element.** §6.5 note 2 is about that, and it is why each host is checked
|
|
37
|
+
* before adopting: neither `Band` nor `AppShell.Root` used `::before` for
|
|
38
|
+
* anything else at the point each one took this class string (spec 2026-09-26
|
|
39
|
+
* R-14 added the second host, so a pack's texture also covers the page ground
|
|
40
|
+
* a console shell paints and not only `<Band separation="ground">`).
|
|
41
|
+
*
|
|
42
|
+
* **No ink here, so no fallback rule to keep.** Every name this spends is a
|
|
43
|
+
* declared pack name with a `:root` default — `texture` is `none`,
|
|
44
|
+
* `texture-size` `auto`, `texture-opacity` `1`, `texture-blend` `normal`, and
|
|
45
|
+
* `fade` (Slice 7's) `none`. Measured: at those defaults the overlay renders
|
|
46
|
+
* identically to the same host with no pseudo-element at all.
|
|
47
|
+
*
|
|
48
|
+
* **The token layer ships no binary.** `--cue-paint-texture` takes a `data:`
|
|
49
|
+
* URI a pack file holds inline, or an absolute `https://` URL a consumer's own
|
|
50
|
+
* CDN serves — `PAINT_VALUES` enforces exactly those two and says why.
|
|
51
|
+
*
|
|
52
|
+
* @internal Not part of the public API.
|
|
53
|
+
*/
|
|
54
|
+
const TEXTURE_CLASSES = "relative isolate before:pointer-events-none before:absolute before:inset-0 before:-z-10 before:content-[''] before:bg-[image:var(--cue-paint-texture)] before:bg-[length:var(--cue-paint-texture-size)] before:opacity-(--cue-paint-texture-opacity) before:[mix-blend-mode:var(--cue-paint-texture-blend)] before:[mask-image:var(--cue-paint-fade)] before:[-webkit-mask-image:var(--cue-paint-fade)]";
|
|
55
|
+
//#endregion
|
|
56
|
+
export { TEXTURE_CLASSES };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
//#region src/system/_style-app-bar.ts
|
|
2
|
+
/**
|
|
3
|
+
* What `AppBar` reads from the style set beyond the navigation voice: the
|
|
4
|
+
* bar's height, its rule's ink and line style, and its inline inset, and a
|
|
5
|
+
* link's padding, hover ground, hover ink and muted ink.
|
|
6
|
+
*
|
|
7
|
+
* Spec 2026-09-26-looks-fidelity §3.7, §3.8, §3.11 and §10.4 (plan R4 and its
|
|
8
|
+
* Graphite addition). The site header serves every Look, so a Look's taller
|
|
9
|
+
* bar (tender, zine, kiln, porcelain), its lighter or absent rule (zine,
|
|
10
|
+
* kiln), its wider inset (graphite) or its padded, tinted links (zine,
|
|
11
|
+
* porcelain) cannot be a class on the header: it would move Classic too
|
|
12
|
+
* (F-18). Each is a style-set name read here.
|
|
13
|
+
*
|
|
14
|
+
* **Every fallback is the class it replaced, spelt out**, for the reason
|
|
15
|
+
* `_style-control-face.ts` gives, so under no set and under every set that
|
|
16
|
+
* declines a name the bar renders exactly what it did:
|
|
17
|
+
*
|
|
18
|
+
* - `h-(--cue-chrome-toolbar)`, `border-border` and `px-(--cue-space-5)` on
|
|
19
|
+
* the bar;
|
|
20
|
+
* - no padding and no ground on a link (`0`, `transparent`) — the link keeps
|
|
21
|
+
* `Link`'s own `rounded-control`, which a padded, tinted link now shows;
|
|
22
|
+
* - `hover:text-accent`, which `AppBar.Link` inherited from `Link`, read here
|
|
23
|
+
* through `style-hover-ink` as spec §3.7 names this reader;
|
|
24
|
+
* - `text-fg-muted` for the `muted` register, read through `style-quiet-ink`
|
|
25
|
+
* (spec §3.7: `fg-muted` for AppBar.Link `muted`).
|
|
26
|
+
*
|
|
27
|
+
* **The hover ground yields to a caller's own ground.** It is the one
|
|
28
|
+
* declaration here the link never had: `Link` sets no background in any state,
|
|
29
|
+
* so `<AppBar.Link className="bg-surface-2">` kept its ground under the pointer.
|
|
30
|
+
* A plain `hover:bg-[…]` is `(0,2,0)` and would paint over it; this is written
|
|
31
|
+
* `[@media(hover:hover)]:[:where(&:hover)]:`, which is `hover:` — the same
|
|
32
|
+
* media query, the same state — at zero specificity, so any class a caller
|
|
33
|
+
* passes for the ground still wins, hovered or not. The hover INK replaced
|
|
34
|
+
* `Link`'s own `hover:text-accent` and keeps its standing, as that did.
|
|
35
|
+
*
|
|
36
|
+
* `style-appbar-inset` entered the contract in the fidelity plan's L5.1:
|
|
37
|
+
* `graphite` declares it (40px, 24px on a phone; G38), and under every other
|
|
38
|
+
* set the bar renders its fallback.
|
|
39
|
+
*
|
|
40
|
+
* **The rule's line style fills Tailwind's own slot** (`style-chrome-rule-style`,
|
|
41
|
+
* round 5 of plan V.2: `zine` dashes it, Z17). The bar's `border-b` writes
|
|
42
|
+
* `border-bottom-style: var(--tw-border-style)`, a slot Tailwind registers as
|
|
43
|
+
* `@property` with `inherits: false` and `initial-value: solid` — which is the
|
|
44
|
+
* solid rule the bar always drew. Filling that slot keeps the one declaration,
|
|
45
|
+
* for the reason `_paint-glass.ts` fills `--tw-backdrop-blur`: a raw
|
|
46
|
+
* `[border-bottom-style:…]` would be a second, competing declaration, and
|
|
47
|
+
* Tailwind emits it after `border-dashed`, so it would beat a caller's own
|
|
48
|
+
* `border-dotted`. Through the slot a caller's style class still wins, because
|
|
49
|
+
* it writes `border-style` itself, after `border-b`. The fallback is the
|
|
50
|
+
* slot's own initial value, and `test/system/style-navigation.test.tsx` asks
|
|
51
|
+
* the compiler for both the slot and that value rather than remembering them.
|
|
52
|
+
*
|
|
53
|
+
* **Its own module**, for the docgen reason `_style-nav-voice.ts` gives: only
|
|
54
|
+
* `AppBar` reads these names, so only `AppBar` is credited with them.
|
|
55
|
+
*
|
|
56
|
+
* @internal Not part of the public API.
|
|
57
|
+
*/
|
|
58
|
+
/** The bar itself: height, bottom rule's ink and line style, and inline inset. */
|
|
59
|
+
const APP_BAR_CHROME = "h-[var(--cue-style-appbar-height,var(--cue-chrome-toolbar))] border-[color:var(--cue-style-chrome-rule,var(--cue-border))] [--tw-border-style:var(--cue-style-chrome-rule-style,solid)] px-[var(--cue-style-appbar-inset,var(--cue-space-5))]";
|
|
60
|
+
/** One link's box and hover: padding, hover ground, hover ink. */
|
|
61
|
+
const APP_BAR_LINK = "p-[var(--cue-style-nav-pad,0)] [@media(hover:hover)]:[:where(&:hover)]:bg-[color:var(--cue-style-nav-hover-ground,transparent)] hover:text-[color:var(--cue-style-hover-ink,var(--cue-accent))]";
|
|
62
|
+
/** The `muted` register's ink. */
|
|
63
|
+
const APP_BAR_QUIET_INK = "text-[color:var(--cue-style-quiet-ink,var(--cue-fg-muted))]";
|
|
64
|
+
//#endregion
|
|
65
|
+
export { APP_BAR_CHROME, APP_BAR_LINK, APP_BAR_QUIET_INK };
|