astralkit 0.4.0 → 0.6.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 +20 -0
- package/astralkit-theme-v4.css +139 -64
- package/astralkit-theme.css +139 -64
- package/astralkit-utilities.css +276 -2
- package/lib/theme-context.d.ts +17 -0
- package/lib/theme-context.js +33 -0
- package/package.json +7 -2
- package/palettes.css +2055 -328
- package/primitives/effects.css +373 -115
- package/primitives/layout.css +3 -0
- package/tailwind.cjs +43 -0
package/astralkit-utilities.css
CHANGED
|
@@ -196,12 +196,41 @@ html {
|
|
|
196
196
|
.ak-switch-track-icon:last-child { right: 10px; }
|
|
197
197
|
/* Off state: left icon hidden (behind knob), right icon visible */
|
|
198
198
|
.ak-switch-with-icons .ak-switch-track-icon:first-child { opacity: 0; }
|
|
199
|
-
.ak-switch-with-icons .ak-switch-track-icon:last-child { color: var(--color-ak-on-
|
|
199
|
+
.ak-switch-with-icons .ak-switch-track-icon:last-child { color: var(--color-ak-inverse-on-surface, #ffffff); opacity: 0.7; }
|
|
200
200
|
/* On state: left icon visible, right icon hidden (behind knob) */
|
|
201
201
|
.ak-switch-with-icons[aria-checked="true"] .ak-switch-track-icon:first-child { color: var(--color-ak-on-primary); opacity: 0.7; }
|
|
202
202
|
.ak-switch-with-icons[aria-checked="true"] .ak-switch-track-icon:last-child { opacity: 0; }
|
|
203
|
+
/* Off-state surfaces: ink track from the inverse pair — palettes tint it, and
|
|
204
|
+
it stays softer than the checked primary track — with the knob swapping the
|
|
205
|
+
same pair so the state icon is legible on every palette in both modes. */
|
|
206
|
+
.ak-switch-with-icons[aria-checked="false"] .ak-switch-track {
|
|
207
|
+
background: color-mix(in srgb, var(--color-ak-inverse-surface, #171717) 84%, var(--color-ak-surface, #ffffff));
|
|
208
|
+
}
|
|
209
|
+
.ak-switch-with-icons[aria-checked="false"] .ak-switch-knob {
|
|
210
|
+
background: var(--color-ak-inverse-on-surface, #ffffff);
|
|
211
|
+
}
|
|
203
212
|
/* Knob icon */
|
|
204
213
|
.ak-switch-knob-icon { font-size: 14px; color: var(--color-ak-text); line-height: 1; }
|
|
214
|
+
.ak-switch-with-icons .ak-switch-knob-icon { color: var(--color-ak-inverse-surface, #171717); }
|
|
215
|
+
.ak-switch-with-icons[aria-checked="true"] .ak-switch-knob-icon { color: var(--color-ak-primary); }
|
|
216
|
+
/* Dark mode: the page is already ink — the off track returns to the neutral
|
|
217
|
+
border tone and the inverse pair flips (inverse-surface reads light). */
|
|
218
|
+
.dark .ak-switch-with-icons[aria-checked="false"] .ak-switch-track,
|
|
219
|
+
[data-theme="dark"] .ak-switch-with-icons[aria-checked="false"] .ak-switch-track {
|
|
220
|
+
background: var(--color-ak-border-strong);
|
|
221
|
+
}
|
|
222
|
+
.dark .ak-switch-with-icons[aria-checked="false"] .ak-switch-knob,
|
|
223
|
+
[data-theme="dark"] .ak-switch-with-icons[aria-checked="false"] .ak-switch-knob {
|
|
224
|
+
background: var(--color-ak-inverse-surface, var(--color-ak-text, #ffffff));
|
|
225
|
+
}
|
|
226
|
+
.dark .ak-switch-with-icons .ak-switch-track-icon:last-child,
|
|
227
|
+
[data-theme="dark"] .ak-switch-with-icons .ak-switch-track-icon:last-child {
|
|
228
|
+
color: var(--color-ak-text, #ffffff);
|
|
229
|
+
}
|
|
230
|
+
.dark .ak-switch-with-icons[aria-checked="false"] .ak-switch-knob-icon,
|
|
231
|
+
[data-theme="dark"] .ak-switch-with-icons[aria-checked="false"] .ak-switch-knob-icon {
|
|
232
|
+
color: var(--color-ak-inverse-on-surface, var(--color-ak-bg, #171717));
|
|
233
|
+
}
|
|
205
234
|
|
|
206
235
|
/* Icon switch — lg (88×44) */
|
|
207
236
|
.ak-switch-icons-lg .ak-switch-track { width: 88px; height: 44px; }
|
|
@@ -524,8 +553,253 @@ body.ak-ew-resizing, body.ak-ew-resizing * {
|
|
|
524
553
|
cursor: ew-resize !important; user-select: none !important; -webkit-user-select: none !important;
|
|
525
554
|
}
|
|
526
555
|
|
|
556
|
+
/* ── Theme Role Utilities ── */
|
|
557
|
+
.ak-theme-control {
|
|
558
|
+
background: var(--color-ak-surface-container-lowest, var(--color-ak-bg));
|
|
559
|
+
border-color: var(--color-ak-outline-variant, var(--color-ak-border-subtle));
|
|
560
|
+
color: var(--color-ak-on-surface, var(--color-ak-text));
|
|
561
|
+
}
|
|
562
|
+
.ak-theme-control:is(button, a, [role="button"], [tabindex]):not([aria-disabled="true"]):not(:disabled):hover {
|
|
563
|
+
background: var(--color-ak-surface-container-low, var(--color-ak-hover));
|
|
564
|
+
border-color: var(--color-ak-outline, var(--color-ak-border));
|
|
565
|
+
}
|
|
566
|
+
.ak-theme-control-selected {
|
|
567
|
+
background: var(--color-ak-secondary, var(--color-ak-primary));
|
|
568
|
+
border-color: var(--color-ak-secondary, var(--color-ak-primary));
|
|
569
|
+
color: var(--color-ak-on-secondary, var(--color-ak-on-primary));
|
|
570
|
+
}
|
|
571
|
+
.ak-theme-control-selected-soft {
|
|
572
|
+
background: var(--color-ak-secondary-container, var(--color-ak-primary-subtle));
|
|
573
|
+
border-color: var(--color-ak-secondary-outline, var(--color-ak-secondary, var(--color-ak-primary)));
|
|
574
|
+
color: var(--color-ak-on-secondary-container, var(--color-ak-text));
|
|
575
|
+
}
|
|
576
|
+
.ak-theme-control-selected-primary {
|
|
577
|
+
background: var(--color-ak-primary);
|
|
578
|
+
border-color: var(--color-ak-primary);
|
|
579
|
+
color: var(--color-ak-on-primary);
|
|
580
|
+
}
|
|
581
|
+
.ak-theme-control-selected-primary-soft {
|
|
582
|
+
background: var(--color-ak-primary-container, var(--color-ak-primary-subtle));
|
|
583
|
+
border-color: var(--color-ak-primary-outline, var(--color-ak-primary));
|
|
584
|
+
color: var(--color-ak-selection-ink, var(--color-ak-on-primary-container, var(--color-ak-text)));
|
|
585
|
+
}
|
|
586
|
+
.ak-theme-icon-well {
|
|
587
|
+
background: var(--color-ak-surface-container, var(--color-ak-surface-2));
|
|
588
|
+
border-color: var(--color-ak-outline-variant, var(--color-ak-border-subtle));
|
|
589
|
+
color: var(--color-ak-on-surface-variant, var(--color-ak-text-secondary));
|
|
590
|
+
}
|
|
591
|
+
.ak-theme-icon-well-selected {
|
|
592
|
+
background: var(--color-ak-secondary, var(--color-ak-primary));
|
|
593
|
+
border-color: var(--color-ak-secondary, var(--color-ak-primary));
|
|
594
|
+
color: var(--color-ak-on-secondary, var(--color-ak-on-primary));
|
|
595
|
+
}
|
|
596
|
+
.ak-theme-icon-well-selected-primary {
|
|
597
|
+
background: var(--color-ak-primary-selection, var(--color-ak-primary));
|
|
598
|
+
border-color: var(--color-ak-primary-selection, var(--color-ak-primary));
|
|
599
|
+
color: var(--color-ak-on-primary-selection, var(--color-ak-on-primary));
|
|
600
|
+
}
|
|
601
|
+
.ak-theme-badge {
|
|
602
|
+
background: var(--color-ak-surface-container-lowest, var(--color-ak-bg));
|
|
603
|
+
border-color: var(--color-ak-outline-variant, var(--color-ak-border-subtle));
|
|
604
|
+
color: var(--color-ak-on-surface-variant, var(--color-ak-text-secondary));
|
|
605
|
+
}
|
|
606
|
+
.ak-theme-badge-selected {
|
|
607
|
+
background: var(--color-ak-accent, var(--color-ak-primary));
|
|
608
|
+
border-color: var(--color-ak-accent, var(--color-ak-primary));
|
|
609
|
+
color: var(--color-ak-on-accent, var(--color-ak-on-primary));
|
|
610
|
+
}
|
|
611
|
+
.ak-theme-media-caption {
|
|
612
|
+
background: var(--color-ak-primary-container, var(--color-ak-secondary-container, var(--color-ak-surface-container-lowest, var(--color-ak-bg))));
|
|
613
|
+
border-color: color-mix(in srgb, var(--color-ak-primary, var(--color-ak-border)) 34%, transparent);
|
|
614
|
+
color: var(--color-ak-on-primary-container, var(--color-ak-on-secondary-container, var(--color-ak-on-surface, var(--color-ak-text))));
|
|
615
|
+
}
|
|
616
|
+
.ak-theme-cta-gradient {
|
|
617
|
+
background: var(--gradient-ak-primary, linear-gradient(135deg, var(--color-ak-primary-hover), var(--color-ak-primary), var(--color-ak-primary-active)));
|
|
618
|
+
background-size: 160% 160%;
|
|
619
|
+
border-color: transparent;
|
|
620
|
+
color: var(--color-ak-on-primary);
|
|
621
|
+
transition:
|
|
622
|
+
background-position var(--duration-ak-slow, 240ms) var(--ease-ak-default, cubic-bezier(0.4, 0, 0.2, 1)),
|
|
623
|
+
filter var(--duration-ak-fast, 110ms) var(--ease-ak-default, cubic-bezier(0.4, 0, 0.2, 1)),
|
|
624
|
+
transform var(--duration-ak-fast, 110ms) var(--ease-ak-spring, cubic-bezier(0.34, 1.56, 0.64, 1));
|
|
625
|
+
}
|
|
626
|
+
.ak-theme-cta-gradient:is(button, a, [role="button"]):not([aria-disabled="true"]):not(:disabled):hover {
|
|
627
|
+
background: var(--gradient-ak-primary-hover, var(--gradient-ak-primary, linear-gradient(135deg, var(--color-ak-primary-hover), var(--color-ak-primary), var(--color-ak-primary-active))));
|
|
628
|
+
background-position: 100% 50%;
|
|
629
|
+
filter: saturate(1.05);
|
|
630
|
+
}
|
|
631
|
+
.ak-theme-cta-gradient:is(button, a, [role="button"]):not([aria-disabled="true"]):not(:disabled):active {
|
|
632
|
+
transform: translateY(1px) scale(0.99);
|
|
633
|
+
}
|
|
634
|
+
.ak-theme-switch-track {
|
|
635
|
+
background: var(--color-ak-surface-container-high, var(--color-ak-surface-2));
|
|
636
|
+
border-color: var(--color-ak-outline-variant, var(--color-ak-border-subtle));
|
|
637
|
+
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-ak-on-surface-variant, var(--color-ak-text-secondary)) 6%, transparent);
|
|
638
|
+
}
|
|
639
|
+
.ak-theme-switch-track-selected {
|
|
640
|
+
background: var(--color-ak-secondary, var(--color-ak-primary));
|
|
641
|
+
border-color: var(--color-ak-secondary, var(--color-ak-primary));
|
|
642
|
+
}
|
|
643
|
+
.ak-theme-switch-track-selected-primary {
|
|
644
|
+
background: var(--color-ak-primary);
|
|
645
|
+
border-color: var(--color-ak-primary);
|
|
646
|
+
}
|
|
647
|
+
.ak-theme-switch-thumb {
|
|
648
|
+
background: var(--color-ak-bg);
|
|
649
|
+
box-shadow: var(--shadow-ak-xs);
|
|
650
|
+
}
|
|
651
|
+
.ak-theme-switch-track-selected .ak-theme-switch-thumb {
|
|
652
|
+
background: var(--color-ak-on-secondary, var(--color-ak-on-primary));
|
|
653
|
+
}
|
|
654
|
+
.ak-theme-switch-track-selected-primary .ak-theme-switch-thumb {
|
|
655
|
+
background: var(--color-ak-on-primary);
|
|
656
|
+
}
|
|
657
|
+
.dark .ak-theme-switch-thumb,
|
|
658
|
+
[data-theme="dark"] .ak-theme-switch-thumb,
|
|
659
|
+
[data-ak-dark-panel] .ak-theme-switch-thumb {
|
|
660
|
+
background: var(--color-ak-text);
|
|
661
|
+
}
|
|
662
|
+
.dark .ak-theme-switch-track-selected .ak-theme-switch-thumb,
|
|
663
|
+
[data-theme="dark"] .ak-theme-switch-track-selected .ak-theme-switch-thumb,
|
|
664
|
+
[data-ak-dark-panel] .ak-theme-switch-track-selected .ak-theme-switch-thumb {
|
|
665
|
+
background: var(--color-ak-on-secondary, var(--color-ak-on-primary));
|
|
666
|
+
}
|
|
667
|
+
.dark .ak-theme-switch-track-selected-primary .ak-theme-switch-thumb,
|
|
668
|
+
[data-theme="dark"] .ak-theme-switch-track-selected-primary .ak-theme-switch-thumb,
|
|
669
|
+
[data-ak-dark-panel] .ak-theme-switch-track-selected-primary .ak-theme-switch-thumb {
|
|
670
|
+
background: var(--color-ak-on-primary);
|
|
671
|
+
}
|
|
672
|
+
.ak-theme-logo-mark {
|
|
673
|
+
transition: filter var(--duration-ak-fast, 110ms) var(--ease-ak-default, cubic-bezier(0.4, 0, 0.2, 1)), opacity var(--duration-ak-fast, 110ms) var(--ease-ak-default, cubic-bezier(0.4, 0, 0.2, 1));
|
|
674
|
+
}
|
|
675
|
+
.dark .ak-theme-logo-mark,
|
|
676
|
+
[data-theme="dark"] .ak-theme-logo-mark,
|
|
677
|
+
[data-ak-dark-panel] .ak-theme-logo-mark {
|
|
678
|
+
filter: invert(1) brightness(1.08) contrast(0.96);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/* Dark premium material utilities.
|
|
682
|
+
These stay dormant in light mode and use the palette glow tokens in dark contexts. */
|
|
683
|
+
.ak-dark-material:is([data-ak-dark-panel], [data-ak-dark-rail], [data-ak-dark-mobile]),
|
|
684
|
+
.ak-dark-material:is(.dark *),
|
|
685
|
+
.dark .ak-dark-material,
|
|
686
|
+
[data-theme="dark"] .ak-dark-material,
|
|
687
|
+
[data-ak-dark-panel] .ak-dark-material,
|
|
688
|
+
[data-ak-dark-rail] .ak-dark-material,
|
|
689
|
+
[data-ak-dark-mobile] .ak-dark-material {
|
|
690
|
+
background:
|
|
691
|
+
linear-gradient(180deg, color-mix(in srgb, var(--color-ak-on-surface, #fff) 5%, transparent), transparent 42%),
|
|
692
|
+
radial-gradient(90% 64% at 50% 0%, color-mix(in srgb, var(--color-ak-glow-primary, #818cf8) 10%, transparent), transparent 72%),
|
|
693
|
+
color-mix(in srgb, var(--color-ak-bg, #111) 90%, var(--color-ak-mesh-base, #050509) 10%);
|
|
694
|
+
border-color: color-mix(in srgb, var(--color-ak-glow-primary, #818cf8) 18%, var(--color-ak-border, rgba(255,255,255,0.12)));
|
|
695
|
+
color: var(--color-ak-on-surface, var(--color-ak-text));
|
|
696
|
+
}
|
|
697
|
+
.ak-dark-control:is(.dark *),
|
|
698
|
+
.dark .ak-dark-control,
|
|
699
|
+
[data-theme="dark"] .ak-dark-control,
|
|
700
|
+
[data-ak-dark-panel] .ak-dark-control,
|
|
701
|
+
[data-ak-dark-rail] .ak-dark-control,
|
|
702
|
+
[data-ak-dark-mobile] .ak-dark-control {
|
|
703
|
+
background-color: transparent;
|
|
704
|
+
border-color: transparent;
|
|
705
|
+
}
|
|
706
|
+
.ak-dark-outlined-control:is(.dark *),
|
|
707
|
+
.dark .ak-dark-outlined-control,
|
|
708
|
+
[data-theme="dark"] .ak-dark-outlined-control,
|
|
709
|
+
[data-ak-dark-panel] .ak-dark-outlined-control,
|
|
710
|
+
[data-ak-dark-rail] .ak-dark-outlined-control,
|
|
711
|
+
[data-ak-dark-mobile] .ak-dark-outlined-control {
|
|
712
|
+
background:
|
|
713
|
+
linear-gradient(180deg, color-mix(in srgb, var(--color-ak-on-surface, #fff) 3%, transparent), transparent 58%),
|
|
714
|
+
color-mix(in srgb, var(--color-ak-bg, #111) 86%, var(--color-ak-on-surface, #fff) 5%);
|
|
715
|
+
border-color: color-mix(in srgb, var(--color-ak-glow-primary, #818cf8) 26%, var(--color-ak-border, rgba(255,255,255,0.12)));
|
|
716
|
+
}
|
|
717
|
+
.ak-dark-avatar-tile:is(.dark *),
|
|
718
|
+
.dark .ak-dark-avatar-tile,
|
|
719
|
+
[data-theme="dark"] .ak-dark-avatar-tile,
|
|
720
|
+
[data-ak-dark-panel] .ak-dark-avatar-tile,
|
|
721
|
+
[data-ak-dark-rail] .ak-dark-avatar-tile,
|
|
722
|
+
[data-ak-dark-mobile] .ak-dark-avatar-tile {
|
|
723
|
+
background:
|
|
724
|
+
radial-gradient(circle at 35% 22%, color-mix(in srgb, var(--color-ak-glow-primary, #818cf8) 30%, transparent), transparent 62%),
|
|
725
|
+
color-mix(in srgb, var(--color-ak-primary-container, #31245a) 72%, var(--color-ak-bg, #111) 28%);
|
|
726
|
+
color: var(--color-ak-on-primary-container, var(--color-ak-on-surface, #fff));
|
|
727
|
+
}
|
|
728
|
+
.ak-dark-control:is(button, a, [role="button"], [tabindex]):not([aria-disabled="true"]):not(:disabled):is(:hover, [data-highlighted]),
|
|
729
|
+
.ak-dark-control:is(button, a, [role="button"], [tabindex]):not([aria-disabled="true"]):not(:disabled)[data-highlighted],
|
|
730
|
+
.dark .ak-dark-control:is(button, a, [role="button"], [tabindex]):not([aria-disabled="true"]):not(:disabled):hover,
|
|
731
|
+
[data-theme="dark"] .ak-dark-control:is(button, a, [role="button"], [tabindex]):not([aria-disabled="true"]):not(:disabled):hover,
|
|
732
|
+
[data-ak-dark-panel] .ak-dark-control:is(button, a, [role="button"], [tabindex]):not([aria-disabled="true"]):not(:disabled):hover,
|
|
733
|
+
[data-ak-dark-rail] .ak-dark-control:is(button, a, [role="button"], [tabindex]):not([aria-disabled="true"]):not(:disabled):hover,
|
|
734
|
+
[data-ak-dark-mobile] .ak-dark-control:is(button, a, [role="button"], [tabindex]):not([aria-disabled="true"]):not(:disabled):hover {
|
|
735
|
+
background:
|
|
736
|
+
linear-gradient(135deg, color-mix(in srgb, var(--color-ak-glow-primary, #818cf8) 10%, transparent), transparent 64%),
|
|
737
|
+
color-mix(in srgb, var(--color-ak-on-surface, #fff) 6%, transparent);
|
|
738
|
+
color: var(--color-ak-on-surface, var(--color-ak-text));
|
|
739
|
+
}
|
|
740
|
+
.ak-dark-control-selected:is(.dark *),
|
|
741
|
+
.dark .ak-dark-control-selected,
|
|
742
|
+
[data-theme="dark"] .ak-dark-control-selected,
|
|
743
|
+
[data-ak-dark-panel] .ak-dark-control-selected,
|
|
744
|
+
[data-ak-dark-rail] .ak-dark-control-selected,
|
|
745
|
+
[data-ak-dark-mobile] .ak-dark-control-selected {
|
|
746
|
+
background:
|
|
747
|
+
radial-gradient(circle at 18% 14%, color-mix(in srgb, var(--color-ak-on-primary, #fff) 22%, transparent), transparent 36%),
|
|
748
|
+
linear-gradient(135deg, var(--color-ak-gradient-start, var(--color-ak-primary-hover)) 0%, var(--color-ak-gradient-mid, var(--color-ak-primary)) 52%, var(--color-ak-gradient-end, var(--color-ak-primary-active)) 100%);
|
|
749
|
+
border-color: color-mix(in srgb, var(--color-ak-glow-primary, #818cf8) 64%, var(--color-ak-border, rgba(255,255,255,0.12)));
|
|
750
|
+
box-shadow:
|
|
751
|
+
inset 0 0 0 1px color-mix(in srgb, var(--color-ak-glow-primary, #818cf8) 46%, transparent),
|
|
752
|
+
inset 0 1px 0 color-mix(in srgb, var(--color-ak-neutral-0, #fff) 16%, transparent),
|
|
753
|
+
0 0 0 1px color-mix(in srgb, var(--color-ak-glow-primary, #818cf8) 14%, transparent),
|
|
754
|
+
0 12px 28px -22px color-mix(in srgb, var(--color-ak-glow-primary, #818cf8) 78%, transparent);
|
|
755
|
+
color: var(--color-ak-on-primary-selection, var(--color-ak-on-primary, #fff));
|
|
756
|
+
}
|
|
757
|
+
.dark .ak-dark-control-selected.ak-selection-ink,
|
|
758
|
+
[data-theme="dark"] .ak-dark-control-selected.ak-selection-ink,
|
|
759
|
+
[data-ak-dark-panel] .ak-dark-control-selected.ak-selection-ink,
|
|
760
|
+
[data-ak-dark-rail] .ak-dark-control-selected.ak-selection-ink,
|
|
761
|
+
[data-ak-dark-mobile] .ak-dark-control-selected.ak-selection-ink,
|
|
762
|
+
.dark .ak-dark-control-selected :where(.ak-selection-ink, i, svg, .ph),
|
|
763
|
+
[data-theme="dark"] .ak-dark-control-selected :where(.ak-selection-ink, i, svg, .ph),
|
|
764
|
+
[data-ak-dark-panel] .ak-dark-control-selected :where(.ak-selection-ink, i, svg, .ph),
|
|
765
|
+
[data-ak-dark-rail] .ak-dark-control-selected :where(.ak-selection-ink, i, svg, .ph),
|
|
766
|
+
[data-ak-dark-mobile] .ak-dark-control-selected :where(.ak-selection-ink, i, svg, .ph) {
|
|
767
|
+
color: var(--color-ak-on-primary-selection, var(--color-ak-on-primary, #fff));
|
|
768
|
+
}
|
|
769
|
+
.ak-dark-accent-tile:is(.dark *),
|
|
770
|
+
.dark .ak-dark-accent-tile,
|
|
771
|
+
[data-theme="dark"] .ak-dark-accent-tile,
|
|
772
|
+
[data-ak-dark-panel] .ak-dark-accent-tile,
|
|
773
|
+
[data-ak-dark-rail] .ak-dark-accent-tile,
|
|
774
|
+
[data-ak-dark-mobile] .ak-dark-accent-tile {
|
|
775
|
+
background:
|
|
776
|
+
radial-gradient(circle at 22% 16%, color-mix(in srgb, var(--color-ak-on-primary, #fff) 20%, transparent), transparent 38%),
|
|
777
|
+
linear-gradient(135deg, var(--color-ak-gradient-start, var(--color-ak-primary-hover)) 0%, var(--color-ak-gradient-mid, var(--color-ak-primary)) 50%, var(--color-ak-gradient-end, var(--color-ak-primary-active)) 100%);
|
|
778
|
+
border-color: color-mix(in srgb, var(--color-ak-glow-primary, #818cf8) 62%, transparent);
|
|
779
|
+
box-shadow:
|
|
780
|
+
inset 0 0 0 1px color-mix(in srgb, var(--color-ak-on-primary, #fff) 16%, transparent),
|
|
781
|
+
0 10px 28px -18px color-mix(in srgb, var(--color-ak-glow-primary, #818cf8) 90%, transparent);
|
|
782
|
+
color: var(--color-ak-on-primary, #fff);
|
|
783
|
+
}
|
|
784
|
+
.ak-dark-accent-tile:is(.dark *) :where(i, svg, .ph),
|
|
785
|
+
.dark .ak-dark-accent-tile :where(i, svg, .ph),
|
|
786
|
+
[data-theme="dark"] .ak-dark-accent-tile :where(i, svg, .ph),
|
|
787
|
+
[data-ak-dark-panel] .ak-dark-accent-tile :where(i, svg, .ph),
|
|
788
|
+
[data-ak-dark-rail] .ak-dark-accent-tile :where(i, svg, .ph),
|
|
789
|
+
[data-ak-dark-mobile] .ak-dark-accent-tile :where(i, svg, .ph) {
|
|
790
|
+
color: var(--color-ak-on-primary, #fff);
|
|
791
|
+
}
|
|
792
|
+
.ak-dark-vivid-ink:is(.dark *),
|
|
793
|
+
.dark .ak-dark-vivid-ink,
|
|
794
|
+
[data-theme="dark"] .ak-dark-vivid-ink,
|
|
795
|
+
[data-ak-dark-panel] .ak-dark-vivid-ink,
|
|
796
|
+
[data-ak-dark-rail] .ak-dark-vivid-ink,
|
|
797
|
+
[data-ak-dark-mobile] .ak-dark-vivid-ink {
|
|
798
|
+
color: var(--color-ak-glow-primary, var(--color-ak-primary));
|
|
799
|
+
}
|
|
800
|
+
|
|
527
801
|
/* ── Focus Ring Utility ── */
|
|
528
|
-
.ak-focus-ring:focus-visible { outline: 2px solid var(--color-ak-primary); outline-offset: 2px; }
|
|
802
|
+
.ak-focus-ring:focus-visible { outline: 2px solid var(--color-ak-border-focus, var(--color-ak-primary)); outline-offset: 2px; }
|
|
529
803
|
|
|
530
804
|
/* ── Price Fade Transition ── */
|
|
531
805
|
.ak-price-fade { transition: opacity 0.15s ease-in-out; }
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
|
|
3
|
+
export interface AkThemeContextValue {
|
|
4
|
+
dark: boolean
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Provides dark mode state to descendants — including Radix portaled content,
|
|
9
|
+
* which escapes the data-ak-dark-* attribute scope on ancestor elements.
|
|
10
|
+
*/
|
|
11
|
+
export declare function AkThemeProvider(props: {
|
|
12
|
+
dark: boolean
|
|
13
|
+
children: React.ReactNode
|
|
14
|
+
}): React.ReactElement
|
|
15
|
+
|
|
16
|
+
/** Read the nearest AkThemeProvider's dark flag. Defaults to { dark: false }. */
|
|
17
|
+
export declare function useAkTheme(): AkThemeContextValue
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { createContext, createElement, useContext } from 'react'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* AkThemeContext — propagates dark mode state to Radix portaled content.
|
|
7
|
+
*
|
|
8
|
+
* Problem: Radix Dialog/DropdownMenu/Popover portal content to document.body,
|
|
9
|
+
* which exits the CSS custom property inheritance chain from data-ak-dark-*
|
|
10
|
+
* attributes on ancestor elements.
|
|
11
|
+
*
|
|
12
|
+
* Solution: Every component that uses Radix portals reads this context and
|
|
13
|
+
* applies the dark mode data attributes directly onto the portaled content.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* <AkThemeProvider dark={isDark}>
|
|
17
|
+
* <MyComponentWithRadixPortals />
|
|
18
|
+
* </AkThemeProvider>
|
|
19
|
+
*
|
|
20
|
+
* // Inside the component:
|
|
21
|
+
* const { dark } = useAkTheme()
|
|
22
|
+
* <DropdownMenu.Content data-ak-dark-panel={dark || undefined}>
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
const AkThemeContext = createContext({ dark: false })
|
|
26
|
+
|
|
27
|
+
export function AkThemeProvider({ dark, children }) {
|
|
28
|
+
return createElement(AkThemeContext.Provider, { value: { dark } }, children)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function useAkTheme() {
|
|
32
|
+
return useContext(AkThemeContext)
|
|
33
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "astralkit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Design tokens and component primitives for accessible UI — Tailwind CSS v3 & v4",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"./tailwind.cjs": "./tailwind.cjs",
|
|
12
12
|
"./utils": "./lib/utils.js",
|
|
13
13
|
"./motion": "./lib/motion.js",
|
|
14
|
+
"./theme-context": "./lib/theme-context.js",
|
|
14
15
|
"./ai-rules": "./ai-rules.md",
|
|
15
16
|
"./palettes": "./palettes.css"
|
|
16
17
|
},
|
|
@@ -32,11 +33,15 @@
|
|
|
32
33
|
"tailwind-merge": "^2.2.0 || ^3.0.0"
|
|
33
34
|
},
|
|
34
35
|
"peerDependencies": {
|
|
35
|
-
"tailwindcss": ">=3.0.0"
|
|
36
|
+
"tailwindcss": ">=3.0.0",
|
|
37
|
+
"react": ">=18.0.0"
|
|
36
38
|
},
|
|
37
39
|
"peerDependenciesMeta": {
|
|
38
40
|
"tailwindcss": {
|
|
39
41
|
"optional": false
|
|
42
|
+
},
|
|
43
|
+
"react": {
|
|
44
|
+
"optional": true
|
|
40
45
|
}
|
|
41
46
|
},
|
|
42
47
|
"keywords": [
|