Chan-Compass / ui_kits /chan-compass /_ds_bundle.js
ranranrunforit's picture
Update ui_kits/chan-compass/_ds_bundle.js
0a876ec verified
Raw
History Blame Contribute Delete
28.8 kB
/* @ds-bundle: {"format":3,"namespace":"ChanCompassSpectrum2DesignSystem_b52b37","components":[{"name":"Button","sourcePath":"components/actions/Button.jsx"},{"name":"Card","sourcePath":"components/containers/Card.jsx"},{"name":"InlineAlert","sourcePath":"components/containers/InlineAlert.jsx"},{"name":"Checkbox","sourcePath":"components/forms/Checkbox.jsx"},{"name":"Field","sourcePath":"components/forms/Field.jsx"},{"name":"Switch","sourcePath":"components/forms/Switch.jsx"},{"name":"Tabs","sourcePath":"components/navigation/Tabs.jsx"},{"name":"Badge","sourcePath":"components/status/Badge.jsx"},{"name":"SignalBadge","sourcePath":"components/status/SignalBadge.jsx"},{"name":"StatusLight","sourcePath":"components/status/StatusLight.jsx"}],"sourceHashes":{"components/actions/Button.jsx":"c9f7501c202c","components/containers/Card.jsx":"9316d0c88d32","components/containers/InlineAlert.jsx":"5ceb8bdaac5f","components/forms/Checkbox.jsx":"59c34e791a76","components/forms/Field.jsx":"39157a609b42","components/forms/Switch.jsx":"38f4684e0ef2","components/navigation/Tabs.jsx":"5488bca491fa","components/status/Badge.jsx":"3e62358e3a0b","components/status/SignalBadge.jsx":"df7989e74422","components/status/StatusLight.jsx":"f7d206a1642b"},"inlinedExternals":[],"unexposedExports":[]} */
(() => {
const __ds_ns = (window.ChanCompassSpectrum2DesignSystem_b52b37 = window.ChanCompassSpectrum2DesignSystem_b52b37 || {});
const __ds_scope = {};
(__ds_ns.__errors = __ds_ns.__errors || []);
// components/actions/Button.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
/* Inject component CSS once. Spectrum 2 buttons: fully-rounded "pill" by
default, medium height 32px, 600 weight, soft state transitions. */
const CSS = `
.s2-btn{
--_bg: var(--accent); --_bgh: var(--accent-hover); --_bgd: var(--accent-down);
--_fg: var(--text-on-accent); --_bd: transparent;
display:inline-flex; align-items:center; justify-content:center; gap:var(--space-100);
font:var(--font-weight-semibold) var(--font-size-100)/1 var(--font-sans);
height:var(--control-height-md); padding:0 var(--space-250);
border-radius:var(--radius-full); border:var(--border-width-200) solid var(--_bd);
background:var(--_bg); color:var(--_fg); cursor:pointer; white-space:nowrap;
transition:var(--transition-colors), transform var(--duration-fast) var(--ease-out);
user-select:none;
}
.s2-btn:hover{ background:var(--_bgh); }
.s2-btn:active{ background:var(--_bgd); transform:scale(.98); }
.s2-btn:focus-visible{ outline:var(--focus-ring-width) solid var(--focus-ring); outline-offset:var(--focus-ring-offset); }
.s2-btn[disabled]{ background:var(--surface-subtle); color:var(--text-disabled); border-color:transparent; cursor:default; transform:none; }
.s2-btn--square{ border-radius:var(--radius-default); }
.s2-btn--sm{ height:var(--control-height-sm); padding:0 var(--space-200); font-size:var(--font-size-75); }
.s2-btn--lg{ height:var(--control-height-lg); padding:0 var(--space-300); font-size:var(--font-size-200); }
/* secondary — outline */
.s2-btn--secondary{ --_bg:var(--surface-card); --_fg:var(--text-body); --_bd:var(--border-strong); }
.s2-btn--secondary:hover{ --_bg:var(--surface-subtle); --_bd:var(--text-secondary); }
.s2-btn--secondary:active{ --_bg:var(--s2-gray-100); }
/* negative */
.s2-btn--negative{ --_bg:var(--negative); --_bgh:var(--negative-hover); --_bgd:var(--s2-red-1100); }
/* quiet — no chrome until hover */
.s2-btn--quiet{ --_bg:transparent; --_fg:var(--text-body); --_bd:transparent; }
.s2-btn--quiet:hover{ --_bg:var(--surface-subtle); }
.s2-btn--quiet:active{ --_bg:var(--s2-gray-100); }
`;
let injected = false;
function useCSS() {
if (typeof document !== 'undefined' && !injected) {
const el = document.createElement('style');
el.textContent = CSS;
el.dataset.s2 = 'button';
document.head.appendChild(el);
injected = true;
}
}
function Button({
variant = 'accent',
size = 'md',
shape = 'pill',
icon,
children,
className = '',
...rest
}) {
useCSS();
const cls = ['s2-btn', variant !== 'accent' && `s2-btn--${variant}`, size !== 'md' && `s2-btn--${size}`, shape === 'square' && 's2-btn--square', className].filter(Boolean).join(' ');
return /*#__PURE__*/React.createElement("button", _extends({
className: cls
}, rest), icon, children);
}
Object.assign(__ds_scope, { Button });
})(); } catch (e) { __ds_ns.__errors.push({ path: "components/actions/Button.jsx", error: String((e && e.message) || e) }); }
// components/containers/Card.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
const CSS = `
.s2-card{
background:var(--surface-card); border:var(--border-width-100) solid var(--border-hairline);
border-radius:var(--card-radius); box-shadow:var(--shadow-raised);
overflow:clip;
}
.s2-card--elevated{ box-shadow:var(--shadow-elevated); }
.s2-card--flat{ box-shadow:none; }
.s2-card--quiet{ background:transparent; border:none; box-shadow:none; }
.s2-card__head{ display:flex; align-items:flex-start; justify-content:space-between; gap:var(--space-200); padding:var(--space-250) var(--space-300) 0; }
.s2-card__titles{ display:flex; flex-direction:column; gap:2px; }
.s2-card__title{ font:var(--type-h3); color:var(--text-heading); }
.s2-card__subtitle{ font:var(--type-detail); color:var(--text-muted); }
.s2-card__body{ padding:var(--space-250) var(--space-300) var(--space-300); }
.s2-card__head + .s2-card__body{ padding-top:var(--space-200); }
`;
let injected = false;
function useCSS() {
if (typeof document !== 'undefined' && !injected) {
const e = document.createElement('style');
e.textContent = CSS;
e.dataset.s2 = 'card';
document.head.appendChild(e);
injected = true;
}
}
function Card({
title,
subtitle,
action,
elevation = 'raised',
children,
className = '',
...rest
}) {
useCSS();
const cls = ['s2-card', elevation !== 'raised' && `s2-card--${elevation}`, className].filter(Boolean).join(' ');
const hasHead = title || subtitle || action;
return /*#__PURE__*/React.createElement("section", _extends({
className: cls
}, rest), hasHead && /*#__PURE__*/React.createElement("header", {
className: "s2-card__head"
}, /*#__PURE__*/React.createElement("div", {
className: "s2-card__titles"
}, title && /*#__PURE__*/React.createElement("span", {
className: "s2-card__title"
}, title), subtitle && /*#__PURE__*/React.createElement("span", {
className: "s2-card__subtitle"
}, subtitle)), action), /*#__PURE__*/React.createElement("div", {
className: "s2-card__body"
}, children));
}
Object.assign(__ds_scope, { Card });
})(); } catch (e) { __ds_ns.__errors.push({ path: "components/containers/Card.jsx", error: String((e && e.message) || e) }); }
// components/containers/InlineAlert.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
/* Spectrum 2 in-line message. A framed notice tied to a region of the page.
`ai` variant is the signature accent-framed panel used for local-LLM output. */
const CSS = `
.s2-alert{
display:flex; gap:var(--space-150); padding:var(--space-200) var(--space-250);
border-radius:var(--radius-lg); border:var(--border-width-100) solid var(--border-default);
background:var(--surface-card); font:var(--type-body); color:var(--text-body);
}
.s2-alert__icon{ flex:none; width:18px; height:18px; display:grid; place-items:center; margin-top:1px; }
.s2-alert__body{ display:flex; flex-direction:column; gap:2px; min-width:0; }
.s2-alert__title{ font:var(--type-ui-bold); color:var(--text-heading); }
.s2-alert--informative{ border-color:var(--accent); background:var(--informative-subtle); }
.s2-alert--informative .s2-alert__icon{ color:var(--accent); }
.s2-alert--positive{ border-color:var(--positive); background:var(--positive-subtle); }
.s2-alert--positive .s2-alert__icon{ color:var(--positive); }
.s2-alert--negative{ border-color:var(--negative); background:var(--negative-subtle); }
.s2-alert--negative .s2-alert__icon{ color:var(--negative); }
.s2-alert--notice{ border-color:var(--notice); background:var(--notice-subtle); }
.s2-alert--notice .s2-alert__icon{ color:var(--notice); }
.s2-alert--ai{
border:var(--border-width-200) solid var(--accent); border-inline-start-width:6px;
border-radius:var(--radius-lg); background:var(--surface-card); box-shadow:var(--shadow-accent);
}
.s2-alert--ai .s2-alert__title{ color:var(--accent-text); }
`;
let injected = false;
function useCSS() {
if (typeof document !== 'undefined' && !injected) {
const e = document.createElement('style');
e.textContent = CSS;
e.dataset.s2 = 'alert';
document.head.appendChild(e);
injected = true;
}
}
const ICONS = {
informative: 'M9 1a8 8 0 100 16A8 8 0 009 1zm0 3.2a1.1 1.1 0 110 2.2 1.1 1.1 0 010-2.2zM10.2 14H7.8v-.9l.9-.2V9.1l-.9-.2V8h2.4v4.9l.9.2v.9z',
positive: 'M9 1a8 8 0 100 16A8 8 0 009 1zm4.2 5.4l-5 5.2a.7.7 0 01-1 0L4.8 9a.7.7 0 011-1l1.9 1.9 4.5-4.6a.7.7 0 011 1z',
negative: 'M9 1a8 8 0 100 16A8 8 0 009 1zm1.1 11.8H7.9v-2.2h2.2v2.2zm0-3.6H7.9V4.2h2.2v5z',
notice: 'M9.9 1.6l7 12.1a1 1 0 01-.9 1.5H2a1 1 0 01-.9-1.5l7-12.1a1 1 0 011.8 0zM7.9 6.2v3.8h2.2V6.2H7.9zm0 5.2v2h2.2v-2H7.9z',
ai: 'M9 1l1.8 4.3L15 7l-4.2 1.7L9 13 7.2 8.7 3 7l4.2-1.7L9 1z'
};
function InlineAlert({
variant = 'informative',
title,
icon,
children,
className = '',
...rest
}) {
useCSS();
const path = ICONS[variant] || ICONS.informative;
return /*#__PURE__*/React.createElement("div", _extends({
className: ['s2-alert', `s2-alert--${variant}`, className].filter(Boolean).join(' ')
}, rest), /*#__PURE__*/React.createElement("span", {
className: "s2-alert__icon"
}, icon || /*#__PURE__*/React.createElement("svg", {
width: "18",
height: "18",
viewBox: "0 0 18 18",
fill: "currentColor"
}, /*#__PURE__*/React.createElement("path", {
d: path
}))), /*#__PURE__*/React.createElement("div", {
className: "s2-alert__body"
}, title && /*#__PURE__*/React.createElement("span", {
className: "s2-alert__title"
}, title), children && /*#__PURE__*/React.createElement("div", null, children)));
}
Object.assign(__ds_scope, { InlineAlert });
})(); } catch (e) { __ds_ns.__errors.push({ path: "components/containers/InlineAlert.jsx", error: String((e && e.message) || e) }); }
// components/forms/Checkbox.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
const CSS = `
.s2-check{ display:inline-flex; align-items:center; gap:var(--space-100); cursor:pointer; font:var(--type-ui); color:var(--text-body); user-select:none; }
.s2-check input{ position:absolute; opacity:0; width:0; height:0; }
.s2-check__box{
width:16px; height:16px; flex:none; border-radius:var(--radius-sm);
border:var(--border-width-200) solid var(--border-field); background:var(--surface-card);
display:grid; place-items:center; transition:var(--transition-colors);
}
.s2-check:hover .s2-check__box{ border-color:var(--text-secondary); }
.s2-check__box svg{ width:11px; height:11px; opacity:0; color:#fff; }
.s2-check input:checked + .s2-check__box{ background:var(--accent); border-color:var(--accent); }
.s2-check input:checked + .s2-check__box svg{ opacity:1; }
.s2-check input:focus-visible + .s2-check__box{ outline:var(--focus-ring-width) solid var(--focus-ring); outline-offset:var(--focus-ring-offset); }
.s2-check input:disabled + .s2-check__box{ background:var(--surface-subtle); border-color:var(--border-default); }
`;
let injected = false;
function useCSS() {
if (typeof document !== 'undefined' && !injected) {
const e = document.createElement('style');
e.textContent = CSS;
e.dataset.s2 = 'checkbox';
document.head.appendChild(e);
injected = true;
}
}
function Checkbox({
checked,
onChange,
children,
disabled = false,
...rest
}) {
useCSS();
return /*#__PURE__*/React.createElement("label", {
className: "s2-check"
}, /*#__PURE__*/React.createElement("input", _extends({
type: "checkbox",
checked: checked,
onChange: onChange,
disabled: disabled
}, rest)), /*#__PURE__*/React.createElement("span", {
className: "s2-check__box"
}, /*#__PURE__*/React.createElement("svg", {
viewBox: "0 0 12 12",
fill: "none"
}, /*#__PURE__*/React.createElement("path", {
d: "M1 6l3.2 3.5L11 2.5",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}))), children && /*#__PURE__*/React.createElement("span", null, children));
}
Object.assign(__ds_scope, { Checkbox });
})(); } catch (e) { __ds_ns.__errors.push({ path: "components/forms/Checkbox.jsx", error: String((e && e.message) || e) }); }
// components/forms/Field.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
const CSS = `
.s2-field{ display:flex; flex-direction:column; gap:var(--space-75); }
.s2-field__label{ font:var(--type-ui-bold); color:var(--text-heading); }
.s2-field__req{ color:var(--negative); margin-inline-start:2px; }
.s2-field__input{
height:var(--control-height-md); padding:0 var(--space-150);
font:var(--type-ui); color:var(--text-body);
background:var(--surface-card);
border:var(--border-width-200) solid var(--border-field);
border-radius:var(--field-radius); outline:none;
transition:var(--transition-colors), box-shadow var(--duration-fast) var(--ease-out);
}
.s2-field__input::placeholder{ color:var(--text-muted); }
.s2-field__input:hover{ border-color:var(--text-secondary); }
.s2-field__input:focus{ border-color:var(--accent); box-shadow:0 0 0 1px var(--accent); }
.s2-field--textarea .s2-field__input{ height:auto; padding:var(--space-150); resize:vertical; line-height:var(--line-height-body); font-family:var(--font-sans); }
.s2-field--mono .s2-field__input{ font-family:var(--font-code); font-size:var(--font-size-75); }
.s2-field--invalid .s2-field__input{ border-color:var(--negative); }
.s2-field--invalid .s2-field__input:focus{ box-shadow:0 0 0 1px var(--negative); }
.s2-field__help{ font:var(--type-detail); color:var(--text-muted); }
.s2-field--invalid .s2-field__help{ color:var(--negative); }
.s2-field__input:disabled{ background:var(--surface-subtle); color:var(--text-disabled); border-color:var(--border-default); cursor:default; }
`;
let injected = false;
function useCSS() {
if (typeof document !== 'undefined' && !injected) {
const el = document.createElement('style');
el.textContent = CSS;
el.dataset.s2 = 'field';
document.head.appendChild(el);
injected = true;
}
}
function Field({
label,
value,
onChange,
placeholder,
type = 'text',
multiline = false,
rows = 4,
mono = false,
required = false,
invalid = false,
help,
disabled = false,
className = '',
...rest
}) {
useCSS();
const cls = ['s2-field', multiline && 's2-field--textarea', mono && 's2-field--mono', invalid && 's2-field--invalid', className].filter(Boolean).join(' ');
const inputProps = {
className: 's2-field__input',
value,
onChange,
placeholder,
disabled,
...rest
};
return /*#__PURE__*/React.createElement("label", {
className: cls
}, label && /*#__PURE__*/React.createElement("span", {
className: "s2-field__label"
}, label, required && /*#__PURE__*/React.createElement("span", {
className: "s2-field__req"
}, "*")), multiline ? /*#__PURE__*/React.createElement("textarea", _extends({
rows: rows
}, inputProps)) : /*#__PURE__*/React.createElement("input", _extends({
type: type
}, inputProps)), help && /*#__PURE__*/React.createElement("span", {
className: "s2-field__help"
}, help));
}
Object.assign(__ds_scope, { Field });
})(); } catch (e) { __ds_ns.__errors.push({ path: "components/forms/Field.jsx", error: String((e && e.message) || e) }); }
// components/forms/Switch.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
const CSS = `
.s2-switch{ display:inline-flex; align-items:center; gap:var(--space-150); cursor:pointer; font:var(--type-ui); color:var(--text-body); user-select:none; }
.s2-switch input{ position:absolute; opacity:0; width:0; height:0; }
.s2-switch__track{
width:32px; height:18px; flex:none; border-radius:var(--radius-full);
background:var(--s2-gray-300); position:relative; transition:background var(--duration-fast) var(--ease-out);
}
.s2-switch__track::after{
content:''; position:absolute; top:2px; left:2px; width:14px; height:14px;
border-radius:var(--radius-full); background:#fff; box-shadow:var(--shadow-raised);
transition:transform var(--duration-default) var(--ease-out);
}
.s2-switch:hover .s2-switch__track{ background:var(--s2-gray-400); }
.s2-switch input:checked + .s2-switch__track{ background:var(--accent); }
.s2-switch input:checked + .s2-switch__track::after{ transform:translateX(14px); }
.s2-switch input:focus-visible + .s2-switch__track{ outline:var(--focus-ring-width) solid var(--focus-ring); outline-offset:var(--focus-ring-offset); }
.s2-switch input:disabled + .s2-switch__track{ background:var(--border-default); }
`;
let injected = false;
function useCSS() {
if (typeof document !== 'undefined' && !injected) {
const e = document.createElement('style');
e.textContent = CSS;
e.dataset.s2 = 'switch';
document.head.appendChild(e);
injected = true;
}
}
function Switch({
checked,
onChange,
children,
disabled = false,
...rest
}) {
useCSS();
return /*#__PURE__*/React.createElement("label", {
className: "s2-switch"
}, /*#__PURE__*/React.createElement("input", _extends({
type: "checkbox",
role: "switch",
checked: checked,
onChange: onChange,
disabled: disabled
}, rest)), /*#__PURE__*/React.createElement("span", {
className: "s2-switch__track"
}), children && /*#__PURE__*/React.createElement("span", null, children));
}
Object.assign(__ds_scope, { Switch });
})(); } catch (e) { __ds_ns.__errors.push({ path: "components/forms/Switch.jsx", error: String((e && e.message) || e) }); }
// components/navigation/Tabs.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
/* Spectrum 2 quiet tabs with an accent underline — the primary navigation in
Chan Compass (Signals / Rotation / News / Research / Automation / Model). */
const CSS = `
.s2-tabs{ display:flex; gap:var(--space-300); border-bottom:var(--border-width-200) solid var(--border-default); }
.s2-tab{
appearance:none; background:none; border:none; cursor:pointer;
padding:var(--space-150) 2px; margin-bottom:-2px;
font:var(--font-weight-semibold) var(--font-size-200)/1.2 var(--font-sans);
color:var(--text-muted); border-bottom:var(--border-width-200) solid transparent;
display:inline-flex; align-items:center; gap:var(--space-100);
transition:var(--transition-colors);
}
.s2-tab:hover{ color:var(--text-body); }
.s2-tab--selected{ color:var(--accent); border-bottom-color:var(--accent); }
.s2-tab:focus-visible{ outline:var(--focus-ring-width) solid var(--focus-ring); outline-offset:2px; border-radius:var(--radius-sm); }
.s2-tab__count{
font:var(--font-weight-semibold) var(--font-size-50)/1 var(--font-sans);
background:var(--surface-subtle); color:var(--text-secondary);
padding:2px 6px; border-radius:var(--radius-full);
}
.s2-tab--selected .s2-tab__count{ background:var(--accent-subtle); color:var(--accent-text); }
`;
let injected = false;
function useCSS() {
if (typeof document !== 'undefined' && !injected) {
const e = document.createElement('style');
e.textContent = CSS;
e.dataset.s2 = 'tabs';
document.head.appendChild(e);
injected = true;
}
}
function Tabs({
items = [],
value,
onChange,
className = '',
...rest
}) {
useCSS();
return /*#__PURE__*/React.createElement("div", _extends({
className: ['s2-tabs', className].filter(Boolean).join(' '),
role: "tablist"
}, rest), items.map(it => {
const id = typeof it === 'string' ? it : it.id;
const label = typeof it === 'string' ? it : it.label;
const selected = id === value;
return /*#__PURE__*/React.createElement("button", {
key: id,
role: "tab",
"aria-selected": selected,
className: ['s2-tab', selected && 's2-tab--selected'].filter(Boolean).join(' '),
onClick: () => onChange && onChange(id)
}, typeof it === 'object' && it.icon, label, typeof it === 'object' && it.count != null && /*#__PURE__*/React.createElement("span", {
className: "s2-tab__count"
}, it.count));
}));
}
Object.assign(__ds_scope, { Tabs });
})(); } catch (e) { __ds_ns.__errors.push({ path: "components/navigation/Tabs.jsx", error: String((e && e.message) || e) }); }
// components/status/Badge.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
const CSS = `
.s2-badge{
display:inline-flex; align-items:center; gap:var(--space-75);
height:20px; padding:0 var(--space-150); border-radius:var(--radius-full);
font:var(--font-weight-semibold) var(--font-size-75)/1 var(--font-sans);
white-space:nowrap;
}
.s2-badge--neutral{ background:var(--surface-subtle); color:var(--text-secondary); }
.s2-badge--accent{ background:var(--accent-subtle); color:var(--accent-text); }
.s2-badge--positive{ background:var(--positive-subtle); color:var(--positive-hover); }
.s2-badge--negative{ background:var(--negative-subtle); color:var(--negative-hover); }
.s2-badge--notice{ background:var(--notice-subtle); color:var(--notice); }
.s2-badge--bold{ color:#fff; }
.s2-badge--bold.s2-badge--accent{ background:var(--accent); }
.s2-badge--bold.s2-badge--positive{ background:var(--positive); }
.s2-badge--bold.s2-badge--negative{ background:var(--negative); }
.s2-badge--bold.s2-badge--neutral{ background:var(--text-secondary); }
`;
let injected = false;
function useCSS() {
if (typeof document !== 'undefined' && !injected) {
const e = document.createElement('style');
e.textContent = CSS;
e.dataset.s2 = 'badge';
document.head.appendChild(e);
injected = true;
}
}
function Badge({
variant = 'neutral',
bold = false,
children,
className = '',
...rest
}) {
useCSS();
const cls = ['s2-badge', `s2-badge--${variant}`, bold && 's2-badge--bold', className].filter(Boolean).join(' ');
return /*#__PURE__*/React.createElement("span", _extends({
className: cls
}, rest), children);
}
Object.assign(__ds_scope, { Badge });
})(); } catch (e) { __ds_ns.__errors.push({ path: "components/status/Badge.jsx", error: String((e && e.message) || e) }); }
// components/status/SignalBadge.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
/* Domain component: the BUY / SELL / HOLD / WAIT signal pill that drives the
Signals table. Maps a Chan-engine action to a Spectrum 2 semantic color. */
const CSS = `
.s2-signal{
display:inline-flex; align-items:center; gap:6px;
height:24px; padding:0 var(--space-150); border-radius:var(--radius-full);
font:var(--font-weight-bold) var(--font-size-75)/1 var(--font-sans);
letter-spacing:.04em; text-transform:uppercase; white-space:nowrap; color:#fff;
}
.s2-signal__glyph{ width:7px; height:7px; border-radius:var(--radius-full); background:currentColor; opacity:.9; }
.s2-signal--buy{ background:var(--positive); }
.s2-signal--sell{ background:var(--negative); }
.s2-signal--hold{ background:var(--accent); }
.s2-signal--wait{ background:var(--surface-subtle); color:var(--text-secondary); }
.s2-signal--watch{ background:var(--notice); }
`;
let injected = false;
function useCSS() {
if (typeof document !== 'undefined' && !injected) {
const e = document.createElement('style');
e.textContent = CSS;
e.dataset.s2 = 'signal';
document.head.appendChild(e);
injected = true;
}
}
const MAP = {
BUY: 'buy',
SELL: 'sell',
HOLD: 'hold',
WAIT: 'wait',
WATCH: 'watch'
};
function SignalBadge({
action = 'WAIT',
className = '',
...rest
}) {
useCSS();
const key = String(action).toUpperCase();
const kind = MAP[key] || 'wait';
return /*#__PURE__*/React.createElement("span", _extends({
className: ['s2-signal', `s2-signal--${kind}`, className].filter(Boolean).join(' ')
}, rest), /*#__PURE__*/React.createElement("span", {
className: "s2-signal__glyph"
}), key);
}
Object.assign(__ds_scope, { SignalBadge });
})(); } catch (e) { __ds_ns.__errors.push({ path: "components/status/SignalBadge.jsx", error: String((e && e.message) || e) }); }
// components/status/StatusLight.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
const CSS = `
.s2-status{ display:inline-flex; align-items:center; gap:var(--space-100); font:var(--type-ui); color:var(--text-body); }
.s2-status__dot{ width:9px; height:9px; flex:none; border-radius:var(--radius-full); background:var(--flat); }
.s2-status--positive .s2-status__dot{ background:var(--positive); }
.s2-status--negative .s2-status__dot{ background:var(--negative); }
.s2-status--notice .s2-status__dot{ background:var(--notice); }
.s2-status--accent .s2-status__dot{ background:var(--accent); }
.s2-status--neutral .s2-status__dot{ background:var(--text-muted); }
.s2-status--live .s2-status__dot{ box-shadow:0 0 0 0 currentColor; animation:s2-pulse 1.8s var(--ease-out) infinite; color:var(--positive); }
@keyframes s2-pulse{ 0%{ box-shadow:0 0 0 0 rgba(0,122,57,.35);} 70%{ box-shadow:0 0 0 6px rgba(0,122,57,0);} 100%{ box-shadow:0 0 0 0 rgba(0,122,57,0);} }
`;
let injected = false;
function useCSS() {
if (typeof document !== 'undefined' && !injected) {
const e = document.createElement('style');
e.textContent = CSS;
e.dataset.s2 = 'status';
document.head.appendChild(e);
injected = true;
}
}
function StatusLight({
variant = 'neutral',
live = false,
children,
className = '',
...rest
}) {
useCSS();
const cls = ['s2-status', `s2-status--${variant}`, live && 's2-status--live', className].filter(Boolean).join(' ');
return /*#__PURE__*/React.createElement("span", _extends({
className: cls
}, rest), /*#__PURE__*/React.createElement("span", {
className: "s2-status__dot"
}), children);
}
Object.assign(__ds_scope, { StatusLight });
})(); } catch (e) { __ds_ns.__errors.push({ path: "components/status/StatusLight.jsx", error: String((e && e.message) || e) }); }
__ds_ns.Button = __ds_scope.Button;
__ds_ns.Card = __ds_scope.Card;
__ds_ns.InlineAlert = __ds_scope.InlineAlert;
__ds_ns.Checkbox = __ds_scope.Checkbox;
__ds_ns.Field = __ds_scope.Field;
__ds_ns.Switch = __ds_scope.Switch;
__ds_ns.Tabs = __ds_scope.Tabs;
__ds_ns.Badge = __ds_scope.Badge;
__ds_ns.SignalBadge = __ds_scope.SignalBadge;
__ds_ns.StatusLight = __ds_scope.StatusLight;
})();