@tensor_1/tokens 2.6.0 → 2.8.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/README.md +11 -0
- package/build/css/components.css +222 -7
- package/build/css/styles.css +222 -7
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -77,3 +77,14 @@ The following CSS primitives (and their `@tensor_1/react` wrappers) are the inte
|
|
|
77
77
|
If you reach for `var(--uix-danger)` or `var(--uix-warning)` to render SLA urgency or severity, use `<StatusPill tone="sla-breached">` or `<StatusPill tone="p1">` instead — the component handles WCAG contrast, dark mode, and brand overrides; a raw literal does not.
|
|
78
78
|
|
|
79
79
|
Likewise, don't fork the data grid: a product-local `data-table.tsx` (bespoke sort/filter/selection/resize + hand-coded column widths) should be replaced by `<Table>` + the subcomponents above, composed over the framework-agnostic `table-engine` (or the `useTable` hook). Sorting, filtering, search highlighting, saved views, and virtualization then match the vanilla styleguide exactly, and every visual affordance re-themes with the tokens listed here.
|
|
80
|
+
|
|
81
|
+
## Documentation site
|
|
82
|
+
|
|
83
|
+
A **build-free** component explorer lives in [`docs/`](./docs/) — a no-bundler HTML shell (`docs/explorer.html`) with a left component nav and a per-component page whose regions (`overview`, `live-example`, `props-table`, `do-dont`, `a11y-notes`) are keyed by `data-region` and filled in incrementally. It reuses the styleguide's theming verbatim (the no-flash `data-theme` script + `[data-uix-theme-toggle]`) and links the same `--uix-*` contract via `../styles/main.css`, so light/dark behaves identically to `index.html`. `docs/docs.js` exposes pure, unit-tested helpers (`slugify`, `componentNav`, `renderPropsTable`) behind a `typeof document` DOM guard; run `node --test docs/docs.test.js`.
|
|
84
|
+
|
|
85
|
+
Serve it from the repo root (the styleguide's static root) so relative asset paths resolve:
|
|
86
|
+
|
|
87
|
+
```sh
|
|
88
|
+
npm run docs:serve
|
|
89
|
+
# → http://localhost:4178/packages/tokens/docs/explorer.html
|
|
90
|
+
```
|
package/build/css/components.css
CHANGED
|
@@ -119,6 +119,9 @@
|
|
|
119
119
|
.uix-field { display: flex; flex-direction: column; gap: var(--uix-space-2); }
|
|
120
120
|
.uix-field__label { font-size: var(--uix-text-meta); font-weight: 500; color: var(--uix-text); }
|
|
121
121
|
.uix-field__label[data-required]::after { content: " *"; color: var(--uix-danger-text); }
|
|
122
|
+
/* message slot for hint / error / success — reserves one line so an appearing error never
|
|
123
|
+
shifts the layout (UIX-FIX-04); the React <Field> always renders it. */
|
|
124
|
+
.uix-field__msg { font-size: var(--uix-text-meta); line-height: 1.45; min-height: 1.45em; }
|
|
122
125
|
.uix-field__hint { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
|
|
123
126
|
.uix-field__error { font-size: var(--uix-text-meta); color: var(--uix-danger-text); display: inline-flex; align-items: center; gap: var(--uix-space-2); }
|
|
124
127
|
.uix-field__error svg, .uix-field__success svg { width: 14px; height: 14px; flex: none; }
|
|
@@ -858,8 +861,28 @@
|
|
|
858
861
|
.uix-avatar--editable:hover .uix-avatar__edit, .uix-avatar--editable:focus-visible .uix-avatar__edit { opacity: 1; }
|
|
859
862
|
.uix-avatar--empty { background: var(--uix-bg-subtle); border: 1.5px dashed var(--uix-border-strong); color: var(--uix-text-muted); }
|
|
860
863
|
}
|
|
861
|
-
/* uix tooltip
|
|
864
|
+
/* uix tooltip. Two flavours, both depend only on --uix-* tokens:
|
|
865
|
+
• .uix-tooltip__bubble — the React <Tooltip>: renders in the top layer via the
|
|
866
|
+
Popover API, so it escapes any overflow:hidden/scroll ancestor (UIX-FIX-02).
|
|
867
|
+
JS sets position/left/top; CSS owns appearance + the fade.
|
|
868
|
+
• [data-uix-tip] — the legacy CSS-only tooltip, kept for back-compat. It is
|
|
869
|
+
position:absolute and so is clipped by an overflow ancestor; prefer <Tooltip>. */
|
|
862
870
|
@layer uix.components {
|
|
871
|
+
.uix-tooltip { display: inline-flex; }
|
|
872
|
+
|
|
873
|
+
.uix-tooltip__bubble {
|
|
874
|
+
position: fixed; margin: 0; inset: auto; border: 0;
|
|
875
|
+
width: max-content; max-width: 16rem;
|
|
876
|
+
background: var(--uix-text); color: var(--uix-bg-app);
|
|
877
|
+
font-size: var(--uix-text-meta); font-weight: 500; line-height: 1.4;
|
|
878
|
+
padding: var(--uix-space-2) var(--uix-space-3); border-radius: var(--uix-radius-sm);
|
|
879
|
+
box-shadow: var(--uix-shadow-popover); white-space: normal; pointer-events: none;
|
|
880
|
+
opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out);
|
|
881
|
+
}
|
|
882
|
+
.uix-tooltip__bubble:popover-open { opacity: 1; }
|
|
883
|
+
@starting-style { .uix-tooltip__bubble:popover-open { opacity: 0; } }
|
|
884
|
+
|
|
885
|
+
/* legacy CSS-only tooltip — clipped by overflow ancestors; superseded by .uix-tooltip__bubble */
|
|
863
886
|
[data-uix-tip] { position: relative; }
|
|
864
887
|
[data-uix-tip]::after {
|
|
865
888
|
content: attr(data-uix-tip); position: absolute; bottom: calc(100% + 6px); left: 50%;
|
|
@@ -870,6 +893,8 @@
|
|
|
870
893
|
transition: opacity var(--uix-dur-fast) var(--uix-ease-out), transform var(--uix-dur-fast) var(--uix-ease-out);
|
|
871
894
|
}
|
|
872
895
|
[data-uix-tip]:hover::after, [data-uix-tip]:focus-visible::after { opacity: 1; transform: translateX(-50%) translateY(0); }
|
|
896
|
+
/* when JS upgrades [data-uix-tip] to a top-layer bubble, drop the clipped CSS-only one */
|
|
897
|
+
.uix-has-js-tip [data-uix-tip]::after { content: none; }
|
|
873
898
|
}
|
|
874
899
|
/* uix progress bar + ring — depends only on --uix-* tokens. */
|
|
875
900
|
@layer uix.components {
|
|
@@ -903,16 +928,22 @@
|
|
|
903
928
|
.uix-timeline__body { padding-bottom: var(--uix-space-5); }
|
|
904
929
|
.uix-timeline__meta { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
|
|
905
930
|
}
|
|
906
|
-
/* uix tree view —
|
|
931
|
+
/* uix tree view — WAI-ARIA tree (role=tree/treeitem/group). Depends only on --uix-* tokens.
|
|
932
|
+
ARIA (aria-expanded / aria-selected / aria-level) lives on the treeitem <li>, so the chevron,
|
|
933
|
+
selection, and collapse styling all key off the item, not the row (UIX-FIX-04). */
|
|
907
934
|
@layer uix.components {
|
|
908
935
|
.uix-tree, .uix-tree ul { list-style: none; margin: 0; padding: 0; }
|
|
909
|
-
.uix-
|
|
910
|
-
.uix-
|
|
911
|
-
.uix-tree__row
|
|
936
|
+
.uix-tree__group { padding-left: var(--uix-space-5); }
|
|
937
|
+
.uix-tree__item { outline: none; } /* the focus ring is drawn on the row, below */
|
|
938
|
+
.uix-tree__row { display: flex; align-items: center; gap: var(--uix-space-2); padding: var(--uix-space-2) var(--uix-space-2); border-radius: var(--uix-radius-sm); cursor: pointer; color: var(--uix-text); font-size: var(--uix-text-body); }
|
|
939
|
+
.uix-tree__label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
940
|
+
.uix-tree__item > .uix-tree__row:hover { background: var(--uix-bg-hover); }
|
|
941
|
+
.uix-tree__item[aria-selected="true"] > .uix-tree__row { background: var(--uix-bg-active); }
|
|
942
|
+
.uix-tree__item:focus-visible > .uix-tree__row { outline: 2px solid var(--uix-ring); outline-offset: -2px; }
|
|
912
943
|
.uix-tree__toggle { width: 16px; height: 16px; flex: none; display: grid; place-items: center; color: var(--uix-text-muted); transition: transform var(--uix-dur) var(--uix-ease-out); }
|
|
913
944
|
.uix-tree__toggle svg { width: 14px; height: 14px; }
|
|
914
|
-
.uix-
|
|
915
|
-
.uix-
|
|
945
|
+
.uix-tree__item[aria-expanded="false"] > .uix-tree__row .uix-tree__toggle { transform: rotate(-90deg); }
|
|
946
|
+
.uix-tree__item[aria-expanded="false"] > .uix-tree__group { display: none; }
|
|
916
947
|
}
|
|
917
948
|
/* uix calendar (shared by date pickers) — depends only on --uix-* tokens. */
|
|
918
949
|
@layer uix.components {
|
|
@@ -1529,3 +1560,187 @@
|
|
|
1529
1560
|
.uix-heartbeat--idle .uix-heartbeat__ping { display: none; }
|
|
1530
1561
|
.uix-live { display: inline-flex; align-items: center; gap: var(--uix-space-2); font-size: var(--uix-text-meta); font-weight: 500; color: var(--uix-text-hushed); }
|
|
1531
1562
|
}
|
|
1563
|
+
/* uix editorial-home kit — the intranet "editorial" landing patterns (INTRA-04):
|
|
1564
|
+
* page intro + search, shortcut grid, notice queue, featured stage + rundown,
|
|
1565
|
+
* section heads, content/rail grids, news lead, content list, resource grid,
|
|
1566
|
+
* stat line, event + status rows. Ported 1:1 from the approved TENSOR intranet
|
|
1567
|
+
* prototype (Docs/prototypes/intranet-reimagined/mockups.css); spacing/type
|
|
1568
|
+
* snapped to the --uix-* scales per the contract gate, editorial display sizes
|
|
1569
|
+
* justified in tests/raw-value-allowlist.json. Depends only on --uix-* tokens. */
|
|
1570
|
+
@layer uix.components {
|
|
1571
|
+
/* ── page intro — kicker/title/lede beside the search well ─────────────────── */
|
|
1572
|
+
.uix-page-intro { margin-top: var(--uix-space-6); display: grid; grid-template-columns: minmax(300px, 0.8fr) minmax(460px, 1.2fr); align-items: end; gap: var(--uix-space-7); }
|
|
1573
|
+
.uix-page-intro .uix-page-lede { margin-top: var(--uix-space-2); }
|
|
1574
|
+
.uix-page-kicker { margin: 0 0 var(--uix-space-2); color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
1575
|
+
.uix-page-title { max-width: 760px; margin: 0; font-family: var(--uix-font-heading); font-size: clamp(30px, 4vw, 48px); font-weight: 400; letter-spacing: -0.035em; line-height: 1.06; }
|
|
1576
|
+
.uix-page-lede { max-width: 680px; margin: var(--uix-space-3) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-h3); }
|
|
1577
|
+
.uix-intro-search__label { margin: 0 0 var(--uix-space-2); color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
1578
|
+
|
|
1579
|
+
.uix-searchbar { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--uix-space-2); }
|
|
1580
|
+
.uix-searchbar .uix-input { min-height: 44px; padding-left: 42px; }
|
|
1581
|
+
.uix-searchbar__wrap { position: relative; }
|
|
1582
|
+
.uix-searchbar__wrap > svg { position: absolute; top: 50%; left: 14px; z-index: var(--uix-z-raised); width: 17px; height: 17px; color: var(--uix-text-hushed); transform: translateY(-50%); pointer-events: none; }
|
|
1583
|
+
|
|
1584
|
+
.uix-shortcut-grid { grid-column: 1 / -1; margin-top: var(--uix-space-4); display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--uix-space-2); }
|
|
1585
|
+
.uix-shortcut-grid .uix-btn { min-height: 42px; justify-content: flex-start; }
|
|
1586
|
+
|
|
1587
|
+
/* ── notice queue — rotating "important updates" banner ────────────────────── */
|
|
1588
|
+
.uix-notice { min-height: 48px; padding: var(--uix-space-2) var(--uix-space-4); display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: var(--uix-space-3); border-left: 2px solid var(--uix-text); background: var(--uix-bg-subtle); }
|
|
1589
|
+
.uix-notice__copy { margin: 0; font-size: var(--uix-text-body); }
|
|
1590
|
+
.uix-notice__copy strong { font-weight: 600; }
|
|
1591
|
+
.uix-notice__content { min-width: 0; }
|
|
1592
|
+
.uix-notice__meta { margin: var(--uix-space-1) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); }
|
|
1593
|
+
.uix-notice__actions { display: flex; align-items: center; justify-content: flex-end; gap: var(--uix-space-2); }
|
|
1594
|
+
.uix-notice__position { margin-right: var(--uix-space-1); color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); white-space: nowrap; }
|
|
1595
|
+
.uix-notice__arrow--previous svg { transform: rotate(180deg); }
|
|
1596
|
+
|
|
1597
|
+
/* ── featured briefing — ONE card: stage + rundown are zones inside it, split
|
|
1598
|
+
by an internal hairline. The selected rundown item grows a caret that sits
|
|
1599
|
+
on (and breaks) that hairline toward the stage, and its ordinal becomes a
|
|
1600
|
+
filled chip echoed by .uix-featured__now in the stage eyebrow — that chip
|
|
1601
|
+
pairing is what carries the selection link once the card stacks. ─────────── */
|
|
1602
|
+
.uix-featured { display: grid; grid-template-columns: minmax(0, 1.7fr) minmax(300px, 0.7fr); align-items: stretch; overflow: hidden; border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); background: var(--uix-surface); }
|
|
1603
|
+
.uix-page-intro + .uix-featured { margin-top: var(--uix-space-6); }
|
|
1604
|
+
|
|
1605
|
+
.uix-featured__stage { min-width: 0; min-height: 302px; display: grid; grid-template-columns: minmax(260px, 0.95fr) minmax(300px, 1.05fr); }
|
|
1606
|
+
.uix-featured__visual {
|
|
1607
|
+
min-height: 302px; padding: var(--uix-space-6) var(--uix-space-7); display: flex; align-items: flex-end;
|
|
1608
|
+
position: relative; overflow: hidden;
|
|
1609
|
+
background:
|
|
1610
|
+
linear-gradient(135deg, transparent 20%, color-mix(in srgb, var(--uix-text) 8%, transparent)),
|
|
1611
|
+
var(--uix-bg-subtle);
|
|
1612
|
+
}
|
|
1613
|
+
.uix-featured__visual::before,
|
|
1614
|
+
.uix-featured__visual::after { content: ""; position: absolute; border: 1px solid var(--uix-border-strong); border-radius: 50%; }
|
|
1615
|
+
.uix-featured__visual::before { width: 240px; height: 240px; top: -78px; right: -42px; }
|
|
1616
|
+
.uix-featured__visual::after { width: 144px; height: 144px; top: 72px; right: 56px; }
|
|
1617
|
+
.uix-featured__content { padding: var(--uix-space-7); display: flex; flex-direction: column; align-items: flex-start; justify-content: center; }
|
|
1618
|
+
.uix-featured__eyebrow { margin: 0 0 var(--uix-space-4); color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase; }
|
|
1619
|
+
.uix-featured__title { margin: 0; font-family: var(--uix-font-heading); font-size: clamp(26px, 3vw, 38px); font-weight: 400; letter-spacing: -0.03em; line-height: 1.08; }
|
|
1620
|
+
.uix-featured__description { margin: var(--uix-space-3) 0 var(--uix-space-5); color: var(--uix-text-hushed); }
|
|
1621
|
+
.uix-featured__meta { margin: 0 0 var(--uix-space-5); color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
1622
|
+
.uix-featured__now { min-width: 22px; height: 22px; display: inline-grid; place-items: center; margin-right: var(--uix-space-2); border-radius: var(--uix-radius-pill); background: var(--uix-text); color: var(--uix-bg-app); font-variant-numeric: tabular-nums; letter-spacing: 0; }
|
|
1623
|
+
|
|
1624
|
+
.uix-story-signal { position: absolute; top: 26px; left: 28px; z-index: var(--uix-z-raised); }
|
|
1625
|
+
.uix-story-signal__value { display: block; font-family: var(--uix-font-heading); font-size: 48px; font-weight: 400; letter-spacing: -0.04em; line-height: 1; }
|
|
1626
|
+
.uix-story-signal__label { display: block; margin-top: var(--uix-space-2); color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
1627
|
+
|
|
1628
|
+
.uix-story-diagram { width: min(100%, 500px); position: relative; z-index: var(--uix-z-raised); display: grid; grid-template-columns: repeat(3, 1fr); align-items: end; gap: var(--uix-space-3); }
|
|
1629
|
+
.uix-story-diagram__bar { min-height: 52px; border: 1px solid var(--uix-border-strong); border-radius: var(--uix-radius-sm); background: color-mix(in srgb, var(--uix-surface) 84%, transparent); }
|
|
1630
|
+
.uix-story-diagram__bar:nth-child(2) { min-height: 104px; }
|
|
1631
|
+
.uix-story-diagram__bar:nth-child(3) { min-height: 126px; background: var(--uix-text); }
|
|
1632
|
+
|
|
1633
|
+
.uix-rundown { min-width: 0; padding: var(--uix-space-4); display: grid; grid-template-rows: auto minmax(0, 1fr); gap: var(--uix-space-3); border-left: 1px solid var(--uix-border); }
|
|
1634
|
+
.uix-rundown__head { padding: var(--uix-space-1) var(--uix-space-1) var(--uix-space-3); display: flex; align-items: flex-start; justify-content: space-between; gap: var(--uix-space-3); border-bottom: 1px solid var(--uix-border); }
|
|
1635
|
+
.uix-rundown__eyebrow { margin: 0; color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); letter-spacing: 0.05em; text-transform: uppercase; }
|
|
1636
|
+
.uix-rundown__title { margin: var(--uix-space-1) 0 0; font-family: var(--uix-font-heading); font-size: 18px; font-weight: 400; }
|
|
1637
|
+
.uix-rundown__items { min-width: 0; display: grid; grid-template-rows: repeat(3, minmax(0, 1fr)); gap: var(--uix-space-2); }
|
|
1638
|
+
.uix-rundown__item { position: relative; min-width: 0; min-height: 68px; padding: var(--uix-space-3); display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: var(--uix-space-3); border: 1px solid transparent; border-radius: var(--uix-radius-sm); background: transparent; color: var(--uix-text); cursor: pointer; font: inherit; text-align: left; }
|
|
1639
|
+
.uix-rundown__item:hover { background: var(--uix-bg-hover); }
|
|
1640
|
+
.uix-rundown__item[data-selected="true"] { border-color: var(--uix-border); background: var(--uix-bg-active); }
|
|
1641
|
+
/* caret centered on the internal divider (16px zone pad + 1px hairline + half of the 12px glyph) */
|
|
1642
|
+
.uix-rundown__item[data-selected="true"]::before { content: ""; position: absolute; top: 50%; left: -23px; width: 12px; height: 12px; transform: translateY(-50%) rotate(45deg); background: var(--uix-surface); border-left: 1px solid var(--uix-border-strong); border-bottom: 1px solid var(--uix-border-strong); }
|
|
1643
|
+
.uix-rundown__number { color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); font-variant-numeric: tabular-nums; }
|
|
1644
|
+
.uix-rundown__item[data-selected="true"] .uix-rundown__number { min-width: 22px; height: 22px; display: inline-grid; place-items: center; border-radius: var(--uix-radius-pill); background: var(--uix-text); color: var(--uix-bg-app); }
|
|
1645
|
+
.uix-rundown__topic,
|
|
1646
|
+
.uix-rundown__item-title { display: block; }
|
|
1647
|
+
.uix-rundown__topic { color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); }
|
|
1648
|
+
.uix-rundown__item-title { margin-top: var(--uix-space-1); font-weight: 600; line-height: 1.2; }
|
|
1649
|
+
|
|
1650
|
+
/* ── section heads ─────────────────────────────────────────────────────────── */
|
|
1651
|
+
.uix-section-head { min-height: 36px; margin-bottom: var(--uix-space-3); display: flex; align-items: center; justify-content: space-between; gap: var(--uix-space-4); }
|
|
1652
|
+
.uix-section-title { margin: 0; font-family: var(--uix-font-heading); font-size: var(--uix-text-h2); font-weight: 400; letter-spacing: var(--uix-tracking-tight); }
|
|
1653
|
+
.uix-section-link { color: var(--uix-text-hushed); font-size: var(--uix-text-meta); text-decoration: none; }
|
|
1654
|
+
.uix-section-link:hover { color: var(--uix-text); }
|
|
1655
|
+
|
|
1656
|
+
/* ── content grid + rail ───────────────────────────────────────────────────── */
|
|
1657
|
+
.uix-content-grid { display: grid; grid-template-columns: minmax(0, 1.65fr) minmax(280px, 0.75fr); gap: var(--uix-space-7); align-items: start; }
|
|
1658
|
+
.uix-content-grid--balanced { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
1659
|
+
.uix-content-grid > * { min-width: 0; }
|
|
1660
|
+
.uix-rail { display: grid; gap: var(--uix-space-4); }
|
|
1661
|
+
.uix-rail-card { padding: var(--uix-space-5); }
|
|
1662
|
+
.uix-rail-card__title { margin: 0; font-family: var(--uix-font-heading); font-size: 18px; font-weight: 400; }
|
|
1663
|
+
.uix-rail-card__meta { margin: var(--uix-space-1) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
1664
|
+
|
|
1665
|
+
/* ── news lead + content list ──────────────────────────────────────────────── */
|
|
1666
|
+
.uix-news-lead { padding: 0 0 var(--uix-space-5); border-bottom: 1px solid var(--uix-border); }
|
|
1667
|
+
.uix-news-lead__meta,
|
|
1668
|
+
.uix-list-meta { color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
1669
|
+
.uix-news-lead__title { margin: var(--uix-space-2) 0 var(--uix-space-1); font-family: var(--uix-font-heading); font-size: var(--uix-text-h2); font-weight: 400; letter-spacing: var(--uix-tracking-tight); }
|
|
1670
|
+
.uix-news-lead__summary { margin: 0; color: var(--uix-text-hushed); }
|
|
1671
|
+
|
|
1672
|
+
.uix-content-list { margin: 0; padding: 0; list-style: none; }
|
|
1673
|
+
.uix-content-list__item { min-height: 68px; padding: var(--uix-space-3) 0; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: var(--uix-space-4); border-bottom: 1px solid var(--uix-border); }
|
|
1674
|
+
.uix-content-list__item:last-child { border-bottom: 0; }
|
|
1675
|
+
.uix-content-list__title { margin: 0; font-weight: 600; }
|
|
1676
|
+
.uix-content-list__meta { margin: var(--uix-space-1) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
1677
|
+
|
|
1678
|
+
/* ── resource grid ─────────────────────────────────────────────────────────── */
|
|
1679
|
+
.uix-resource-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--uix-space-2); }
|
|
1680
|
+
.uix-resource-grid .uix-btn { min-height: 44px; justify-content: flex-start; }
|
|
1681
|
+
|
|
1682
|
+
/* ── stat line ─────────────────────────────────────────────────────────────── */
|
|
1683
|
+
.uix-stat-line { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); border-top: 1px solid var(--uix-border); }
|
|
1684
|
+
.uix-stat-line__item { padding: var(--uix-space-4) var(--uix-space-2) var(--uix-space-1) 0; }
|
|
1685
|
+
.uix-stat-line__value { display: block; font-size: 20px; font-variant-numeric: tabular-nums; }
|
|
1686
|
+
.uix-stat-line__label { color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); }
|
|
1687
|
+
|
|
1688
|
+
/* ── event + status rows ───────────────────────────────────────────────────── */
|
|
1689
|
+
.uix-event-row { min-height: 64px; padding-block: var(--uix-space-3); display: grid; grid-template-columns: 42px minmax(0, 1fr); align-items: center; gap: var(--uix-space-3); border-bottom: 1px solid var(--uix-border); }
|
|
1690
|
+
.uix-event-row:last-child { border-bottom: 0; }
|
|
1691
|
+
.uix-event-date { text-align: center; }
|
|
1692
|
+
.uix-event-date__month { display: block; color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); text-transform: uppercase; }
|
|
1693
|
+
.uix-event-date__day { display: block; font-size: 18px; font-variant-numeric: tabular-nums; }
|
|
1694
|
+
.uix-event-row__title { margin: 0; font-weight: 600; }
|
|
1695
|
+
.uix-event-row__meta { margin: var(--uix-space-1) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
1696
|
+
|
|
1697
|
+
.uix-status-row { min-height: 48px; display: flex; align-items: center; gap: var(--uix-space-3); border-bottom: 1px solid var(--uix-border); }
|
|
1698
|
+
.uix-status-row:last-child { border-bottom: 0; }
|
|
1699
|
+
.uix-status-row__name { flex: 1; }
|
|
1700
|
+
|
|
1701
|
+
/* ── responsive — ported 1:1 from the prototype's 920/620 breakpoints ──────── */
|
|
1702
|
+
@media (max-width: 920px) {
|
|
1703
|
+
.uix-page-intro,
|
|
1704
|
+
.uix-content-grid,
|
|
1705
|
+
.uix-content-grid--balanced,
|
|
1706
|
+
.uix-featured { grid-template-columns: 1fr; }
|
|
1707
|
+
|
|
1708
|
+
.uix-rundown { border-left: 0; border-top: 1px solid var(--uix-border); }
|
|
1709
|
+
.uix-rundown__items { grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-rows: 1fr; }
|
|
1710
|
+
/* stacked zones: the caret flips to point up at the stage above */
|
|
1711
|
+
.uix-rundown__item[data-selected="true"]::before { top: -23px; left: 22px; transform: rotate(45deg); border-bottom: 0; border-top: 1px solid var(--uix-border-strong); }
|
|
1712
|
+
|
|
1713
|
+
.uix-shortcut-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
1714
|
+
}
|
|
1715
|
+
|
|
1716
|
+
@media (max-width: 620px) {
|
|
1717
|
+
.uix-featured__stage { grid-template-columns: 1fr; }
|
|
1718
|
+
.uix-featured__visual { min-height: 190px; }
|
|
1719
|
+
.uix-featured__content { padding: var(--uix-space-6); }
|
|
1720
|
+
|
|
1721
|
+
.uix-rundown__items { grid-template-columns: 1fr; grid-template-rows: repeat(3, auto); }
|
|
1722
|
+
/* vertical item stack: the directional caret stops making sense — the
|
|
1723
|
+
ordinal chips (item number + .uix-featured__now) carry the pairing */
|
|
1724
|
+
.uix-rundown__item[data-selected="true"]::before { display: none; }
|
|
1725
|
+
|
|
1726
|
+
.uix-notice { grid-template-columns: auto minmax(0, 1fr); }
|
|
1727
|
+
.uix-notice > .uix-btn { grid-column: 2; justify-self: start; }
|
|
1728
|
+
.uix-notice__actions { grid-column: 1 / -1; width: 100%; justify-content: flex-start; flex-wrap: wrap; }
|
|
1729
|
+
.uix-notice__position { flex: 1; }
|
|
1730
|
+
|
|
1731
|
+
.uix-searchbar { grid-template-columns: 1fr; }
|
|
1732
|
+
.uix-searchbar .uix-btn { min-height: 44px; }
|
|
1733
|
+
|
|
1734
|
+
.uix-page-intro { margin-top: var(--uix-space-5); gap: var(--uix-space-5); }
|
|
1735
|
+
.uix-shortcut-grid { grid-template-columns: 1fr 1fr; }
|
|
1736
|
+
.uix-shortcut-grid .uix-btn { min-height: 48px; }
|
|
1737
|
+
|
|
1738
|
+
.uix-story-signal { top: 20px; left: 20px; }
|
|
1739
|
+
.uix-story-signal__value { font-size: var(--uix-text-display); }
|
|
1740
|
+
|
|
1741
|
+
.uix-resource-grid { grid-template-columns: 1fr; }
|
|
1742
|
+
|
|
1743
|
+
.uix-stat-line { grid-template-columns: 1fr; }
|
|
1744
|
+
.uix-stat-line__item { display: flex; align-items: baseline; justify-content: space-between; border-bottom: 1px solid var(--uix-border); }
|
|
1745
|
+
}
|
|
1746
|
+
}
|
package/build/css/styles.css
CHANGED
|
@@ -415,6 +415,9 @@
|
|
|
415
415
|
.uix-field { display: flex; flex-direction: column; gap: var(--uix-space-2); }
|
|
416
416
|
.uix-field__label { font-size: var(--uix-text-meta); font-weight: 500; color: var(--uix-text); }
|
|
417
417
|
.uix-field__label[data-required]::after { content: " *"; color: var(--uix-danger-text); }
|
|
418
|
+
/* message slot for hint / error / success — reserves one line so an appearing error never
|
|
419
|
+
shifts the layout (UIX-FIX-04); the React <Field> always renders it. */
|
|
420
|
+
.uix-field__msg { font-size: var(--uix-text-meta); line-height: 1.45; min-height: 1.45em; }
|
|
418
421
|
.uix-field__hint { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
|
|
419
422
|
.uix-field__error { font-size: var(--uix-text-meta); color: var(--uix-danger-text); display: inline-flex; align-items: center; gap: var(--uix-space-2); }
|
|
420
423
|
.uix-field__error svg, .uix-field__success svg { width: 14px; height: 14px; flex: none; }
|
|
@@ -1199,8 +1202,28 @@
|
|
|
1199
1202
|
.uix-avatar--editable:hover .uix-avatar__edit, .uix-avatar--editable:focus-visible .uix-avatar__edit { opacity: 1; }
|
|
1200
1203
|
.uix-avatar--empty { background: var(--uix-bg-subtle); border: 1.5px dashed var(--uix-border-strong); color: var(--uix-text-muted); }
|
|
1201
1204
|
}
|
|
1202
|
-
/* uix tooltip
|
|
1205
|
+
/* uix tooltip. Two flavours, both depend only on --uix-* tokens:
|
|
1206
|
+
• .uix-tooltip__bubble — the React <Tooltip>: renders in the top layer via the
|
|
1207
|
+
Popover API, so it escapes any overflow:hidden/scroll ancestor (UIX-FIX-02).
|
|
1208
|
+
JS sets position/left/top; CSS owns appearance + the fade.
|
|
1209
|
+
• [data-uix-tip] — the legacy CSS-only tooltip, kept for back-compat. It is
|
|
1210
|
+
position:absolute and so is clipped by an overflow ancestor; prefer <Tooltip>. */
|
|
1203
1211
|
@layer uix.components {
|
|
1212
|
+
.uix-tooltip { display: inline-flex; }
|
|
1213
|
+
|
|
1214
|
+
.uix-tooltip__bubble {
|
|
1215
|
+
position: fixed; margin: 0; inset: auto; border: 0;
|
|
1216
|
+
width: max-content; max-width: 16rem;
|
|
1217
|
+
background: var(--uix-text); color: var(--uix-bg-app);
|
|
1218
|
+
font-size: var(--uix-text-meta); font-weight: 500; line-height: 1.4;
|
|
1219
|
+
padding: var(--uix-space-2) var(--uix-space-3); border-radius: var(--uix-radius-sm);
|
|
1220
|
+
box-shadow: var(--uix-shadow-popover); white-space: normal; pointer-events: none;
|
|
1221
|
+
opacity: 0; transition: opacity var(--uix-dur-fast) var(--uix-ease-out);
|
|
1222
|
+
}
|
|
1223
|
+
.uix-tooltip__bubble:popover-open { opacity: 1; }
|
|
1224
|
+
@starting-style { .uix-tooltip__bubble:popover-open { opacity: 0; } }
|
|
1225
|
+
|
|
1226
|
+
/* legacy CSS-only tooltip — clipped by overflow ancestors; superseded by .uix-tooltip__bubble */
|
|
1204
1227
|
[data-uix-tip] { position: relative; }
|
|
1205
1228
|
[data-uix-tip]::after {
|
|
1206
1229
|
content: attr(data-uix-tip); position: absolute; bottom: calc(100% + 6px); left: 50%;
|
|
@@ -1211,6 +1234,8 @@
|
|
|
1211
1234
|
transition: opacity var(--uix-dur-fast) var(--uix-ease-out), transform var(--uix-dur-fast) var(--uix-ease-out);
|
|
1212
1235
|
}
|
|
1213
1236
|
[data-uix-tip]:hover::after, [data-uix-tip]:focus-visible::after { opacity: 1; transform: translateX(-50%) translateY(0); }
|
|
1237
|
+
/* when JS upgrades [data-uix-tip] to a top-layer bubble, drop the clipped CSS-only one */
|
|
1238
|
+
.uix-has-js-tip [data-uix-tip]::after { content: none; }
|
|
1214
1239
|
}
|
|
1215
1240
|
/* uix progress bar + ring — depends only on --uix-* tokens. */
|
|
1216
1241
|
@layer uix.components {
|
|
@@ -1244,16 +1269,22 @@
|
|
|
1244
1269
|
.uix-timeline__body { padding-bottom: var(--uix-space-5); }
|
|
1245
1270
|
.uix-timeline__meta { font-size: var(--uix-text-meta); color: var(--uix-text-muted); }
|
|
1246
1271
|
}
|
|
1247
|
-
/* uix tree view —
|
|
1272
|
+
/* uix tree view — WAI-ARIA tree (role=tree/treeitem/group). Depends only on --uix-* tokens.
|
|
1273
|
+
ARIA (aria-expanded / aria-selected / aria-level) lives on the treeitem <li>, so the chevron,
|
|
1274
|
+
selection, and collapse styling all key off the item, not the row (UIX-FIX-04). */
|
|
1248
1275
|
@layer uix.components {
|
|
1249
1276
|
.uix-tree, .uix-tree ul { list-style: none; margin: 0; padding: 0; }
|
|
1250
|
-
.uix-
|
|
1251
|
-
.uix-
|
|
1252
|
-
.uix-tree__row
|
|
1277
|
+
.uix-tree__group { padding-left: var(--uix-space-5); }
|
|
1278
|
+
.uix-tree__item { outline: none; } /* the focus ring is drawn on the row, below */
|
|
1279
|
+
.uix-tree__row { display: flex; align-items: center; gap: var(--uix-space-2); padding: var(--uix-space-2) var(--uix-space-2); border-radius: var(--uix-radius-sm); cursor: pointer; color: var(--uix-text); font-size: var(--uix-text-body); }
|
|
1280
|
+
.uix-tree__label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
1281
|
+
.uix-tree__item > .uix-tree__row:hover { background: var(--uix-bg-hover); }
|
|
1282
|
+
.uix-tree__item[aria-selected="true"] > .uix-tree__row { background: var(--uix-bg-active); }
|
|
1283
|
+
.uix-tree__item:focus-visible > .uix-tree__row { outline: 2px solid var(--uix-ring); outline-offset: -2px; }
|
|
1253
1284
|
.uix-tree__toggle { width: 16px; height: 16px; flex: none; display: grid; place-items: center; color: var(--uix-text-muted); transition: transform var(--uix-dur) var(--uix-ease-out); }
|
|
1254
1285
|
.uix-tree__toggle svg { width: 14px; height: 14px; }
|
|
1255
|
-
.uix-
|
|
1256
|
-
.uix-
|
|
1286
|
+
.uix-tree__item[aria-expanded="false"] > .uix-tree__row .uix-tree__toggle { transform: rotate(-90deg); }
|
|
1287
|
+
.uix-tree__item[aria-expanded="false"] > .uix-tree__group { display: none; }
|
|
1257
1288
|
}
|
|
1258
1289
|
/* uix calendar (shared by date pickers) — depends only on --uix-* tokens. */
|
|
1259
1290
|
@layer uix.components {
|
|
@@ -1870,3 +1901,187 @@
|
|
|
1870
1901
|
.uix-heartbeat--idle .uix-heartbeat__ping { display: none; }
|
|
1871
1902
|
.uix-live { display: inline-flex; align-items: center; gap: var(--uix-space-2); font-size: var(--uix-text-meta); font-weight: 500; color: var(--uix-text-hushed); }
|
|
1872
1903
|
}
|
|
1904
|
+
/* uix editorial-home kit — the intranet "editorial" landing patterns (INTRA-04):
|
|
1905
|
+
* page intro + search, shortcut grid, notice queue, featured stage + rundown,
|
|
1906
|
+
* section heads, content/rail grids, news lead, content list, resource grid,
|
|
1907
|
+
* stat line, event + status rows. Ported 1:1 from the approved TENSOR intranet
|
|
1908
|
+
* prototype (Docs/prototypes/intranet-reimagined/mockups.css); spacing/type
|
|
1909
|
+
* snapped to the --uix-* scales per the contract gate, editorial display sizes
|
|
1910
|
+
* justified in tests/raw-value-allowlist.json. Depends only on --uix-* tokens. */
|
|
1911
|
+
@layer uix.components {
|
|
1912
|
+
/* ── page intro — kicker/title/lede beside the search well ─────────────────── */
|
|
1913
|
+
.uix-page-intro { margin-top: var(--uix-space-6); display: grid; grid-template-columns: minmax(300px, 0.8fr) minmax(460px, 1.2fr); align-items: end; gap: var(--uix-space-7); }
|
|
1914
|
+
.uix-page-intro .uix-page-lede { margin-top: var(--uix-space-2); }
|
|
1915
|
+
.uix-page-kicker { margin: 0 0 var(--uix-space-2); color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
1916
|
+
.uix-page-title { max-width: 760px; margin: 0; font-family: var(--uix-font-heading); font-size: clamp(30px, 4vw, 48px); font-weight: 400; letter-spacing: -0.035em; line-height: 1.06; }
|
|
1917
|
+
.uix-page-lede { max-width: 680px; margin: var(--uix-space-3) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-h3); }
|
|
1918
|
+
.uix-intro-search__label { margin: 0 0 var(--uix-space-2); color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
1919
|
+
|
|
1920
|
+
.uix-searchbar { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--uix-space-2); }
|
|
1921
|
+
.uix-searchbar .uix-input { min-height: 44px; padding-left: 42px; }
|
|
1922
|
+
.uix-searchbar__wrap { position: relative; }
|
|
1923
|
+
.uix-searchbar__wrap > svg { position: absolute; top: 50%; left: 14px; z-index: var(--uix-z-raised); width: 17px; height: 17px; color: var(--uix-text-hushed); transform: translateY(-50%); pointer-events: none; }
|
|
1924
|
+
|
|
1925
|
+
.uix-shortcut-grid { grid-column: 1 / -1; margin-top: var(--uix-space-4); display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--uix-space-2); }
|
|
1926
|
+
.uix-shortcut-grid .uix-btn { min-height: 42px; justify-content: flex-start; }
|
|
1927
|
+
|
|
1928
|
+
/* ── notice queue — rotating "important updates" banner ────────────────────── */
|
|
1929
|
+
.uix-notice { min-height: 48px; padding: var(--uix-space-2) var(--uix-space-4); display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: var(--uix-space-3); border-left: 2px solid var(--uix-text); background: var(--uix-bg-subtle); }
|
|
1930
|
+
.uix-notice__copy { margin: 0; font-size: var(--uix-text-body); }
|
|
1931
|
+
.uix-notice__copy strong { font-weight: 600; }
|
|
1932
|
+
.uix-notice__content { min-width: 0; }
|
|
1933
|
+
.uix-notice__meta { margin: var(--uix-space-1) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); }
|
|
1934
|
+
.uix-notice__actions { display: flex; align-items: center; justify-content: flex-end; gap: var(--uix-space-2); }
|
|
1935
|
+
.uix-notice__position { margin-right: var(--uix-space-1); color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); white-space: nowrap; }
|
|
1936
|
+
.uix-notice__arrow--previous svg { transform: rotate(180deg); }
|
|
1937
|
+
|
|
1938
|
+
/* ── featured briefing — ONE card: stage + rundown are zones inside it, split
|
|
1939
|
+
by an internal hairline. The selected rundown item grows a caret that sits
|
|
1940
|
+
on (and breaks) that hairline toward the stage, and its ordinal becomes a
|
|
1941
|
+
filled chip echoed by .uix-featured__now in the stage eyebrow — that chip
|
|
1942
|
+
pairing is what carries the selection link once the card stacks. ─────────── */
|
|
1943
|
+
.uix-featured { display: grid; grid-template-columns: minmax(0, 1.7fr) minmax(300px, 0.7fr); align-items: stretch; overflow: hidden; border: 1px solid var(--uix-border); border-radius: var(--uix-radius-md); background: var(--uix-surface); }
|
|
1944
|
+
.uix-page-intro + .uix-featured { margin-top: var(--uix-space-6); }
|
|
1945
|
+
|
|
1946
|
+
.uix-featured__stage { min-width: 0; min-height: 302px; display: grid; grid-template-columns: minmax(260px, 0.95fr) minmax(300px, 1.05fr); }
|
|
1947
|
+
.uix-featured__visual {
|
|
1948
|
+
min-height: 302px; padding: var(--uix-space-6) var(--uix-space-7); display: flex; align-items: flex-end;
|
|
1949
|
+
position: relative; overflow: hidden;
|
|
1950
|
+
background:
|
|
1951
|
+
linear-gradient(135deg, transparent 20%, color-mix(in srgb, var(--uix-text) 8%, transparent)),
|
|
1952
|
+
var(--uix-bg-subtle);
|
|
1953
|
+
}
|
|
1954
|
+
.uix-featured__visual::before,
|
|
1955
|
+
.uix-featured__visual::after { content: ""; position: absolute; border: 1px solid var(--uix-border-strong); border-radius: 50%; }
|
|
1956
|
+
.uix-featured__visual::before { width: 240px; height: 240px; top: -78px; right: -42px; }
|
|
1957
|
+
.uix-featured__visual::after { width: 144px; height: 144px; top: 72px; right: 56px; }
|
|
1958
|
+
.uix-featured__content { padding: var(--uix-space-7); display: flex; flex-direction: column; align-items: flex-start; justify-content: center; }
|
|
1959
|
+
.uix-featured__eyebrow { margin: 0 0 var(--uix-space-4); color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); letter-spacing: var(--uix-tracking-eyebrow); text-transform: uppercase; }
|
|
1960
|
+
.uix-featured__title { margin: 0; font-family: var(--uix-font-heading); font-size: clamp(26px, 3vw, 38px); font-weight: 400; letter-spacing: -0.03em; line-height: 1.08; }
|
|
1961
|
+
.uix-featured__description { margin: var(--uix-space-3) 0 var(--uix-space-5); color: var(--uix-text-hushed); }
|
|
1962
|
+
.uix-featured__meta { margin: 0 0 var(--uix-space-5); color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
1963
|
+
.uix-featured__now { min-width: 22px; height: 22px; display: inline-grid; place-items: center; margin-right: var(--uix-space-2); border-radius: var(--uix-radius-pill); background: var(--uix-text); color: var(--uix-bg-app); font-variant-numeric: tabular-nums; letter-spacing: 0; }
|
|
1964
|
+
|
|
1965
|
+
.uix-story-signal { position: absolute; top: 26px; left: 28px; z-index: var(--uix-z-raised); }
|
|
1966
|
+
.uix-story-signal__value { display: block; font-family: var(--uix-font-heading); font-size: 48px; font-weight: 400; letter-spacing: -0.04em; line-height: 1; }
|
|
1967
|
+
.uix-story-signal__label { display: block; margin-top: var(--uix-space-2); color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
1968
|
+
|
|
1969
|
+
.uix-story-diagram { width: min(100%, 500px); position: relative; z-index: var(--uix-z-raised); display: grid; grid-template-columns: repeat(3, 1fr); align-items: end; gap: var(--uix-space-3); }
|
|
1970
|
+
.uix-story-diagram__bar { min-height: 52px; border: 1px solid var(--uix-border-strong); border-radius: var(--uix-radius-sm); background: color-mix(in srgb, var(--uix-surface) 84%, transparent); }
|
|
1971
|
+
.uix-story-diagram__bar:nth-child(2) { min-height: 104px; }
|
|
1972
|
+
.uix-story-diagram__bar:nth-child(3) { min-height: 126px; background: var(--uix-text); }
|
|
1973
|
+
|
|
1974
|
+
.uix-rundown { min-width: 0; padding: var(--uix-space-4); display: grid; grid-template-rows: auto minmax(0, 1fr); gap: var(--uix-space-3); border-left: 1px solid var(--uix-border); }
|
|
1975
|
+
.uix-rundown__head { padding: var(--uix-space-1) var(--uix-space-1) var(--uix-space-3); display: flex; align-items: flex-start; justify-content: space-between; gap: var(--uix-space-3); border-bottom: 1px solid var(--uix-border); }
|
|
1976
|
+
.uix-rundown__eyebrow { margin: 0; color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); letter-spacing: 0.05em; text-transform: uppercase; }
|
|
1977
|
+
.uix-rundown__title { margin: var(--uix-space-1) 0 0; font-family: var(--uix-font-heading); font-size: 18px; font-weight: 400; }
|
|
1978
|
+
.uix-rundown__items { min-width: 0; display: grid; grid-template-rows: repeat(3, minmax(0, 1fr)); gap: var(--uix-space-2); }
|
|
1979
|
+
.uix-rundown__item { position: relative; min-width: 0; min-height: 68px; padding: var(--uix-space-3); display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: var(--uix-space-3); border: 1px solid transparent; border-radius: var(--uix-radius-sm); background: transparent; color: var(--uix-text); cursor: pointer; font: inherit; text-align: left; }
|
|
1980
|
+
.uix-rundown__item:hover { background: var(--uix-bg-hover); }
|
|
1981
|
+
.uix-rundown__item[data-selected="true"] { border-color: var(--uix-border); background: var(--uix-bg-active); }
|
|
1982
|
+
/* caret centered on the internal divider (16px zone pad + 1px hairline + half of the 12px glyph) */
|
|
1983
|
+
.uix-rundown__item[data-selected="true"]::before { content: ""; position: absolute; top: 50%; left: -23px; width: 12px; height: 12px; transform: translateY(-50%) rotate(45deg); background: var(--uix-surface); border-left: 1px solid var(--uix-border-strong); border-bottom: 1px solid var(--uix-border-strong); }
|
|
1984
|
+
.uix-rundown__number { color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); font-variant-numeric: tabular-nums; }
|
|
1985
|
+
.uix-rundown__item[data-selected="true"] .uix-rundown__number { min-width: 22px; height: 22px; display: inline-grid; place-items: center; border-radius: var(--uix-radius-pill); background: var(--uix-text); color: var(--uix-bg-app); }
|
|
1986
|
+
.uix-rundown__topic,
|
|
1987
|
+
.uix-rundown__item-title { display: block; }
|
|
1988
|
+
.uix-rundown__topic { color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); }
|
|
1989
|
+
.uix-rundown__item-title { margin-top: var(--uix-space-1); font-weight: 600; line-height: 1.2; }
|
|
1990
|
+
|
|
1991
|
+
/* ── section heads ─────────────────────────────────────────────────────────── */
|
|
1992
|
+
.uix-section-head { min-height: 36px; margin-bottom: var(--uix-space-3); display: flex; align-items: center; justify-content: space-between; gap: var(--uix-space-4); }
|
|
1993
|
+
.uix-section-title { margin: 0; font-family: var(--uix-font-heading); font-size: var(--uix-text-h2); font-weight: 400; letter-spacing: var(--uix-tracking-tight); }
|
|
1994
|
+
.uix-section-link { color: var(--uix-text-hushed); font-size: var(--uix-text-meta); text-decoration: none; }
|
|
1995
|
+
.uix-section-link:hover { color: var(--uix-text); }
|
|
1996
|
+
|
|
1997
|
+
/* ── content grid + rail ───────────────────────────────────────────────────── */
|
|
1998
|
+
.uix-content-grid { display: grid; grid-template-columns: minmax(0, 1.65fr) minmax(280px, 0.75fr); gap: var(--uix-space-7); align-items: start; }
|
|
1999
|
+
.uix-content-grid--balanced { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
2000
|
+
.uix-content-grid > * { min-width: 0; }
|
|
2001
|
+
.uix-rail { display: grid; gap: var(--uix-space-4); }
|
|
2002
|
+
.uix-rail-card { padding: var(--uix-space-5); }
|
|
2003
|
+
.uix-rail-card__title { margin: 0; font-family: var(--uix-font-heading); font-size: 18px; font-weight: 400; }
|
|
2004
|
+
.uix-rail-card__meta { margin: var(--uix-space-1) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
2005
|
+
|
|
2006
|
+
/* ── news lead + content list ──────────────────────────────────────────────── */
|
|
2007
|
+
.uix-news-lead { padding: 0 0 var(--uix-space-5); border-bottom: 1px solid var(--uix-border); }
|
|
2008
|
+
.uix-news-lead__meta,
|
|
2009
|
+
.uix-list-meta { color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
2010
|
+
.uix-news-lead__title { margin: var(--uix-space-2) 0 var(--uix-space-1); font-family: var(--uix-font-heading); font-size: var(--uix-text-h2); font-weight: 400; letter-spacing: var(--uix-tracking-tight); }
|
|
2011
|
+
.uix-news-lead__summary { margin: 0; color: var(--uix-text-hushed); }
|
|
2012
|
+
|
|
2013
|
+
.uix-content-list { margin: 0; padding: 0; list-style: none; }
|
|
2014
|
+
.uix-content-list__item { min-height: 68px; padding: var(--uix-space-3) 0; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: var(--uix-space-4); border-bottom: 1px solid var(--uix-border); }
|
|
2015
|
+
.uix-content-list__item:last-child { border-bottom: 0; }
|
|
2016
|
+
.uix-content-list__title { margin: 0; font-weight: 600; }
|
|
2017
|
+
.uix-content-list__meta { margin: var(--uix-space-1) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
2018
|
+
|
|
2019
|
+
/* ── resource grid ─────────────────────────────────────────────────────────── */
|
|
2020
|
+
.uix-resource-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--uix-space-2); }
|
|
2021
|
+
.uix-resource-grid .uix-btn { min-height: 44px; justify-content: flex-start; }
|
|
2022
|
+
|
|
2023
|
+
/* ── stat line ─────────────────────────────────────────────────────────────── */
|
|
2024
|
+
.uix-stat-line { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); border-top: 1px solid var(--uix-border); }
|
|
2025
|
+
.uix-stat-line__item { padding: var(--uix-space-4) var(--uix-space-2) var(--uix-space-1) 0; }
|
|
2026
|
+
.uix-stat-line__value { display: block; font-size: 20px; font-variant-numeric: tabular-nums; }
|
|
2027
|
+
.uix-stat-line__label { color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); }
|
|
2028
|
+
|
|
2029
|
+
/* ── event + status rows ───────────────────────────────────────────────────── */
|
|
2030
|
+
.uix-event-row { min-height: 64px; padding-block: var(--uix-space-3); display: grid; grid-template-columns: 42px minmax(0, 1fr); align-items: center; gap: var(--uix-space-3); border-bottom: 1px solid var(--uix-border); }
|
|
2031
|
+
.uix-event-row:last-child { border-bottom: 0; }
|
|
2032
|
+
.uix-event-date { text-align: center; }
|
|
2033
|
+
.uix-event-date__month { display: block; color: var(--uix-text-hushed); font-size: var(--uix-text-eyebrow); text-transform: uppercase; }
|
|
2034
|
+
.uix-event-date__day { display: block; font-size: 18px; font-variant-numeric: tabular-nums; }
|
|
2035
|
+
.uix-event-row__title { margin: 0; font-weight: 600; }
|
|
2036
|
+
.uix-event-row__meta { margin: var(--uix-space-1) 0 0; color: var(--uix-text-hushed); font-size: var(--uix-text-meta); }
|
|
2037
|
+
|
|
2038
|
+
.uix-status-row { min-height: 48px; display: flex; align-items: center; gap: var(--uix-space-3); border-bottom: 1px solid var(--uix-border); }
|
|
2039
|
+
.uix-status-row:last-child { border-bottom: 0; }
|
|
2040
|
+
.uix-status-row__name { flex: 1; }
|
|
2041
|
+
|
|
2042
|
+
/* ── responsive — ported 1:1 from the prototype's 920/620 breakpoints ──────── */
|
|
2043
|
+
@media (max-width: 920px) {
|
|
2044
|
+
.uix-page-intro,
|
|
2045
|
+
.uix-content-grid,
|
|
2046
|
+
.uix-content-grid--balanced,
|
|
2047
|
+
.uix-featured { grid-template-columns: 1fr; }
|
|
2048
|
+
|
|
2049
|
+
.uix-rundown { border-left: 0; border-top: 1px solid var(--uix-border); }
|
|
2050
|
+
.uix-rundown__items { grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-rows: 1fr; }
|
|
2051
|
+
/* stacked zones: the caret flips to point up at the stage above */
|
|
2052
|
+
.uix-rundown__item[data-selected="true"]::before { top: -23px; left: 22px; transform: rotate(45deg); border-bottom: 0; border-top: 1px solid var(--uix-border-strong); }
|
|
2053
|
+
|
|
2054
|
+
.uix-shortcut-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
2055
|
+
}
|
|
2056
|
+
|
|
2057
|
+
@media (max-width: 620px) {
|
|
2058
|
+
.uix-featured__stage { grid-template-columns: 1fr; }
|
|
2059
|
+
.uix-featured__visual { min-height: 190px; }
|
|
2060
|
+
.uix-featured__content { padding: var(--uix-space-6); }
|
|
2061
|
+
|
|
2062
|
+
.uix-rundown__items { grid-template-columns: 1fr; grid-template-rows: repeat(3, auto); }
|
|
2063
|
+
/* vertical item stack: the directional caret stops making sense — the
|
|
2064
|
+
ordinal chips (item number + .uix-featured__now) carry the pairing */
|
|
2065
|
+
.uix-rundown__item[data-selected="true"]::before { display: none; }
|
|
2066
|
+
|
|
2067
|
+
.uix-notice { grid-template-columns: auto minmax(0, 1fr); }
|
|
2068
|
+
.uix-notice > .uix-btn { grid-column: 2; justify-self: start; }
|
|
2069
|
+
.uix-notice__actions { grid-column: 1 / -1; width: 100%; justify-content: flex-start; flex-wrap: wrap; }
|
|
2070
|
+
.uix-notice__position { flex: 1; }
|
|
2071
|
+
|
|
2072
|
+
.uix-searchbar { grid-template-columns: 1fr; }
|
|
2073
|
+
.uix-searchbar .uix-btn { min-height: 44px; }
|
|
2074
|
+
|
|
2075
|
+
.uix-page-intro { margin-top: var(--uix-space-5); gap: var(--uix-space-5); }
|
|
2076
|
+
.uix-shortcut-grid { grid-template-columns: 1fr 1fr; }
|
|
2077
|
+
.uix-shortcut-grid .uix-btn { min-height: 48px; }
|
|
2078
|
+
|
|
2079
|
+
.uix-story-signal { top: 20px; left: 20px; }
|
|
2080
|
+
.uix-story-signal__value { font-size: var(--uix-text-display); }
|
|
2081
|
+
|
|
2082
|
+
.uix-resource-grid { grid-template-columns: 1fr; }
|
|
2083
|
+
|
|
2084
|
+
.uix-stat-line { grid-template-columns: 1fr; }
|
|
2085
|
+
.uix-stat-line__item { display: flex; align-items: baseline; justify-content: space-between; border-bottom: 1px solid var(--uix-border); }
|
|
2086
|
+
}
|
|
2087
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tensor_1/tokens",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.0",
|
|
4
4
|
"description": "UIx v2 design tokens — the --uix-* contract for house products (Tensor, POSx, SHOPx). One DTCG source -> CSS variables, Tailwind theme, and typed TS constants.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -39,6 +39,9 @@
|
|
|
39
39
|
"build": "npm run build:tokens && npm run build:themes && npm run build:styles",
|
|
40
40
|
"test:parity": "node scripts/check-parity.mjs",
|
|
41
41
|
"test:contract": "node scripts/check-contract.mjs",
|
|
42
|
+
"docs:serve": "serve -l 4178 ../..",
|
|
43
|
+
"size:css": "node scripts/size-report.mjs --check",
|
|
44
|
+
"size:css:update": "node scripts/size-report.mjs --update",
|
|
42
45
|
"prepublishOnly": "npm run build && npm run test:parity && npm run test:contract"
|
|
43
46
|
},
|
|
44
47
|
"devDependencies": {
|