@kolkrabbi/kol-theme 0.142.0 → 0.144.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/kol-components-atoms.css
CHANGED
|
@@ -1304,3 +1304,16 @@ a.kol-icon-frame {
|
|
|
1304
1304
|
height: 44px;
|
|
1305
1305
|
}
|
|
1306
1306
|
}
|
|
1307
|
+
|
|
1308
|
+
/* THE MOMENTARY PRESS (editor-chrome-review, kol-fxr 2026-09-03 — the user's
|
|
1309
|
+
* ruling on `AlignmentGrid`: two three-way strips, momentary, no selection
|
|
1310
|
+
* state). A STATELESS strip (`value={null}`) never lights a cell, because its
|
|
1311
|
+
* cells are actions and not a state the object is in — so the press itself has
|
|
1312
|
+
* to be the feedback, and it is `:active` rather than a new prop. `tone` was
|
|
1313
|
+
* the candidate and is wrong: tone is the GROUND axis and says nothing about a
|
|
1314
|
+
* momentary press. Excluded on an active cell — a selected cell's ink is the
|
|
1315
|
+
* selection, and a press must not out-shout it. */
|
|
1316
|
+
.kol-seg-cell:active:not(.is-active) {
|
|
1317
|
+
background: var(--kol-oq-08);
|
|
1318
|
+
color: var(--kol-fg-emphasis);
|
|
1319
|
+
}
|
|
@@ -150,8 +150,14 @@
|
|
|
150
150
|
/* Popover — default chrome for floating-ui-positioned panels.
|
|
151
151
|
* Used by molecules/Popover.jsx PopoverPanel. */
|
|
152
152
|
.kol-popover {
|
|
153
|
-
|
|
154
|
-
|
|
153
|
+
/* A TONED panel paints that tone's ground; unset it keeps surface-secondary,
|
|
154
|
+
* so nothing existing moves (editor-chrome-review, kol-fxr 2026-09-03 — in
|
|
155
|
+
* dark, surface-secondary is LIGHTER than the bar a menu drops from, so the
|
|
156
|
+
* layering read inverted). The border is the OPAQUE ramp, not the alpha one:
|
|
157
|
+
* a floating panel overlaps whatever is under it, and an alpha hairline
|
|
158
|
+
* composites twice at every overlap — the same law the icons follow. */
|
|
159
|
+
background: var(--kol-tone-bg, var(--kol-surface-secondary));
|
|
160
|
+
border: 1px solid var(--kol-oq-04);
|
|
155
161
|
border-radius: var(--kol-radius-sm);
|
|
156
162
|
box-shadow: 0 8px 24px -8px rgba(0, 0, 0, 0.4),
|
|
157
163
|
0 2px 6px -2px rgba(0, 0, 0, 0.3);
|
|
@@ -696,3 +696,207 @@
|
|
|
696
696
|
width: calc((100cqw - (var(--kol-catalog-n, 6) - 1) * 24px) / var(--kol-catalog-n, 6));
|
|
697
697
|
}
|
|
698
698
|
|
|
699
|
+
|
|
700
|
+
/* ─────────────────────────── LayerStack ───────────────────────────────
|
|
701
|
+
* The layers panel (editor-panels-the-held-specs A1, kol-fxr 2026-09-03).
|
|
702
|
+
* Values are the engine's `.kol-compose-layer-*` rules verbatim, renamed:
|
|
703
|
+
* the DS owns this chrome now, and two owners of one class name is the drift
|
|
704
|
+
* this estate keeps paying for. CSS rather than utilities because the states,
|
|
705
|
+
* the drop indicators (pseudo-elements) and the hover-reveal (a descendant
|
|
706
|
+
* rule off `[data-layer-stack]:hover`) are not expressible as classes on the
|
|
707
|
+
* element.
|
|
708
|
+
* ───────────────────────────────────────────────────────────────────── */
|
|
709
|
+
|
|
710
|
+
.kol-layer-stack-line {
|
|
711
|
+
display: flex;
|
|
712
|
+
align-items: center;
|
|
713
|
+
gap: 2px;
|
|
714
|
+
}
|
|
715
|
+
.kol-layer-stack-collapse {
|
|
716
|
+
width: 16px;
|
|
717
|
+
height: 16px;
|
|
718
|
+
flex: 0 0 16px;
|
|
719
|
+
display: inline-flex;
|
|
720
|
+
align-items: center;
|
|
721
|
+
justify-content: center;
|
|
722
|
+
background: transparent;
|
|
723
|
+
border: none;
|
|
724
|
+
cursor: pointer;
|
|
725
|
+
color: var(--kol-fg-64);
|
|
726
|
+
padding: 0;
|
|
727
|
+
}
|
|
728
|
+
.kol-layer-stack-collapse:hover { color: var(--kol-surface-on-primary); }
|
|
729
|
+
/* Chevrons are focus chrome, not resting chrome (Figma model): hidden until
|
|
730
|
+
the pointer is inside the stack, then every container row shows its own. */
|
|
731
|
+
.kol-layer-stack-collapse { opacity: 0; transition: opacity 120ms; }
|
|
732
|
+
[data-layer-stack]:hover .kol-layer-stack-collapse { opacity: 1; }
|
|
733
|
+
/* Indent nested rows one chevron slot per level — a child's type icon aligns
|
|
734
|
+
under its parent's icon, not its name. Top-level rows sit flush. */
|
|
735
|
+
.kol-layer-stack-nest { padding-left: 16px; }
|
|
736
|
+
|
|
737
|
+
.kol-layer-stack-row {
|
|
738
|
+
display: flex;
|
|
739
|
+
align-items: center;
|
|
740
|
+
flex: 1 1 auto;
|
|
741
|
+
min-width: 0;
|
|
742
|
+
padding: 4px 60px 4px 8px; /* right padding reserves the two absolutely-
|
|
743
|
+
positioned toggle buttons */
|
|
744
|
+
color: var(--kol-fg-64);
|
|
745
|
+
border-radius: 4px;
|
|
746
|
+
cursor: grab;
|
|
747
|
+
position: relative;
|
|
748
|
+
}
|
|
749
|
+
.kol-layer-stack-row:hover {
|
|
750
|
+
background: var(--kol-fg-04);
|
|
751
|
+
color: var(--kol-surface-on-primary);
|
|
752
|
+
}
|
|
753
|
+
/* Selected = accent highlight; a selected container also tints its expanded
|
|
754
|
+
children block one shade lighter (Figma model). Hover stays grey. */
|
|
755
|
+
.kol-layer-stack-row.is-active {
|
|
756
|
+
background: color-mix(in srgb, var(--kol-accent-primary) 26%, transparent);
|
|
757
|
+
color: var(--kol-fg-emphasis);
|
|
758
|
+
}
|
|
759
|
+
.kol-layer-stack-row.is-tinted {
|
|
760
|
+
background: color-mix(in srgb, var(--kol-accent-primary) 11%, transparent);
|
|
761
|
+
}
|
|
762
|
+
/* Hidden layer — dim the icon + name only; the slashed eye stays legible. */
|
|
763
|
+
.kol-layer-stack-row.is-hidden .kol-layer-stack-main { opacity: 0.4; }
|
|
764
|
+
.kol-layer-stack-row.is-dragging { opacity: 0.4; cursor: grabbing; }
|
|
765
|
+
.kol-layer-stack-row[draggable]:active { cursor: grabbing; }
|
|
766
|
+
|
|
767
|
+
/* Drop indicator — 2px accent line at the top or bottom of the target row. */
|
|
768
|
+
.kol-layer-stack-row.is-drop-above::before,
|
|
769
|
+
.kol-layer-stack-row.is-drop-below::after {
|
|
770
|
+
content: '';
|
|
771
|
+
position: absolute;
|
|
772
|
+
left: 4px;
|
|
773
|
+
right: 4px;
|
|
774
|
+
height: 2px;
|
|
775
|
+
background: var(--kol-accent-primary);
|
|
776
|
+
pointer-events: none;
|
|
777
|
+
z-index: 1;
|
|
778
|
+
}
|
|
779
|
+
.kol-layer-stack-row.is-drop-above::before { top: -1px; }
|
|
780
|
+
.kol-layer-stack-row.is-drop-below::after { bottom: -1px; }
|
|
781
|
+
|
|
782
|
+
.kol-layer-stack-main {
|
|
783
|
+
display: flex;
|
|
784
|
+
align-items: center;
|
|
785
|
+
gap: 8px;
|
|
786
|
+
flex: 1 1 auto;
|
|
787
|
+
min-width: 0;
|
|
788
|
+
background: transparent;
|
|
789
|
+
border: none;
|
|
790
|
+
cursor: pointer;
|
|
791
|
+
color: inherit;
|
|
792
|
+
padding: 0;
|
|
793
|
+
text-align: left;
|
|
794
|
+
}
|
|
795
|
+
.kol-layer-stack-icon {
|
|
796
|
+
display: inline-flex;
|
|
797
|
+
align-items: center;
|
|
798
|
+
justify-content: center;
|
|
799
|
+
width: 18px;
|
|
800
|
+
height: 18px;
|
|
801
|
+
flex-shrink: 0;
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
/* The eye and the lock: absolute in the row's reserved right padding, hidden
|
|
805
|
+
until the row is hovered, PINNED visible when the layer is hidden / locked
|
|
806
|
+
or the row is active (`.is-pinned`), so a toggled state is never a secret. */
|
|
807
|
+
.kol-layer-stack-toggle {
|
|
808
|
+
position: absolute;
|
|
809
|
+
top: 0;
|
|
810
|
+
bottom: 0;
|
|
811
|
+
width: 28px;
|
|
812
|
+
display: inline-flex;
|
|
813
|
+
align-items: center;
|
|
814
|
+
justify-content: center;
|
|
815
|
+
border: none;
|
|
816
|
+
background: transparent;
|
|
817
|
+
border-radius: 4px;
|
|
818
|
+
padding: 0;
|
|
819
|
+
cursor: pointer;
|
|
820
|
+
color: var(--kol-oq-48);
|
|
821
|
+
opacity: 0;
|
|
822
|
+
transition: opacity 120ms;
|
|
823
|
+
}
|
|
824
|
+
.kol-layer-stack-toggle--eye { right: 28px; }
|
|
825
|
+
.kol-layer-stack-toggle--lock { right: 0; }
|
|
826
|
+
.kol-layer-stack-row:hover .kol-layer-stack-toggle,
|
|
827
|
+
.kol-layer-stack-toggle.is-pinned { opacity: 1; }
|
|
828
|
+
.kol-layer-stack-toggle:hover { color: var(--kol-fg-emphasis); background: var(--kol-fg-08); }
|
|
829
|
+
.kol-layer-stack-toggle.is-on { color: var(--kol-accent-primary); }
|
|
830
|
+
|
|
831
|
+
/* ── ColumnBrowser · the mobile four-zone row ──────────────────────────
|
|
832
|
+
* ColumnBrowserMobileViews §1 (kol-r2b2, 2026-09-03). Height follows zone 2,
|
|
833
|
+
* the 44px thumbnail: 60px, not the DS Table's `12px 16px`, which is right for
|
|
834
|
+
* a 14px glyph and three times too airy for a thumbnail. The divider starts at
|
|
835
|
+
* ZONE 3's left edge — 14 disclosure + 8 gap + 44 icon + 8 gap = 74 — which is
|
|
836
|
+
* what both references draw and what a utility cannot express, since it is a
|
|
837
|
+
* pseudo-element inset on a sibling boundary.
|
|
838
|
+
* ─────────────────────────────────────────────────────────────────────── */
|
|
839
|
+
.kol-column-browser-row--zones {
|
|
840
|
+
min-height: 60px;
|
|
841
|
+
position: relative;
|
|
842
|
+
}
|
|
843
|
+
.kol-column-browser-row--zones + .kol-column-browser-row--zones::before {
|
|
844
|
+
content: '';
|
|
845
|
+
position: absolute;
|
|
846
|
+
top: 0;
|
|
847
|
+
left: 74px; /* zone 3's left edge */
|
|
848
|
+
right: 0;
|
|
849
|
+
height: 1px;
|
|
850
|
+
background: var(--kol-oq-08);
|
|
851
|
+
pointer-events: none;
|
|
852
|
+
}
|
|
853
|
+
/* the thumbnail fills its box and crops — a media tile is the image, not a
|
|
854
|
+
letterboxed one */
|
|
855
|
+
.kol-column-browser-thumb img,
|
|
856
|
+
.kol-column-browser-thumb video {
|
|
857
|
+
width: 100%;
|
|
858
|
+
height: 100%;
|
|
859
|
+
object-fit: cover;
|
|
860
|
+
display: block;
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
/* ── ColumnBrowser · the mobile grid (item 14) ─────────────────────────
|
|
864
|
+
* 3-up below `md`. For a media bucket the thumbnail IS the tile, so the box is
|
|
865
|
+
* square and the name sits under it; counts, not dates (§2). */
|
|
866
|
+
.kol-column-browser-grid {
|
|
867
|
+
display: grid;
|
|
868
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
869
|
+
gap: var(--kol-spacing-3);
|
|
870
|
+
padding: var(--kol-spacing-3);
|
|
871
|
+
}
|
|
872
|
+
.kol-column-browser-tile {
|
|
873
|
+
display: flex;
|
|
874
|
+
flex-direction: column;
|
|
875
|
+
gap: var(--kol-spacing-1);
|
|
876
|
+
min-width: 0;
|
|
877
|
+
cursor: pointer;
|
|
878
|
+
background: transparent;
|
|
879
|
+
border: none;
|
|
880
|
+
padding: 0;
|
|
881
|
+
text-align: left;
|
|
882
|
+
}
|
|
883
|
+
.kol-column-browser-tile-box {
|
|
884
|
+
aspect-ratio: 1;
|
|
885
|
+
border-radius: 5px;
|
|
886
|
+
background: var(--kol-oq-04);
|
|
887
|
+
display: flex;
|
|
888
|
+
align-items: center;
|
|
889
|
+
justify-content: center;
|
|
890
|
+
overflow: hidden;
|
|
891
|
+
}
|
|
892
|
+
.kol-column-browser-tile-box img,
|
|
893
|
+
.kol-column-browser-tile-box video {
|
|
894
|
+
width: 100%;
|
|
895
|
+
height: 100%;
|
|
896
|
+
object-fit: cover;
|
|
897
|
+
display: block;
|
|
898
|
+
}
|
|
899
|
+
.kol-column-browser-tile.is-selected .kol-column-browser-tile-box {
|
|
900
|
+
outline: 2px solid var(--kol-accent-primary);
|
|
901
|
+
outline-offset: 1px;
|
|
902
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kolkrabbi/kol-theme",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.144.0",
|
|
4
4
|
"description": "KOL (Kolkrabbi) design-system tokens + base CSS — brand-neutral. The canonical token/cascade layer every other KOL package and consumer builds on.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|