astralkit 0.3.2 → 0.3.4

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 CHANGED
@@ -5,6 +5,11 @@ All notable changes to the `astralkit` SDK package.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.3.3] — 2026-04-22
9
+
10
+ ### Changed
11
+ - Widened `tailwind-merge` dependency range from `^2.2.0` to `^2.2.0 || ^3.0.0`. Tailwind CSS v4 projects use `tailwind-merge@v3` (which adds v4 class-name recognition), so accepting either major version lets npm dedupe to the host project's copy instead of nesting a second `node_modules/astralkit/node_modules/tailwind-merge`. Same `twMerge` API in both; no SDK code change required.
12
+
8
13
  ## [0.3.2] — 2026-04-19
9
14
 
10
15
  ### Fixed (revert of accidental change in 0.3.0 / 0.3.1)
package/ai-rules.md CHANGED
@@ -17,6 +17,8 @@ These constraints prevent generic "AI slop" output. Follow them strictly.
17
17
 
18
18
  **Never use raw Tailwind colors.** No `bg-white`, `text-gray-900`, `border-slate-200`. Always use `bg-ak-bg`, `text-ak-text`, `border-ak-border`. Raw colors break theming, dark mode, and palette switching.
19
19
 
20
+ **Never use `text-white` or `text-black`.** Use `text-ak-on-primary` for text on primary-colored backgrounds, `text-ak-text-inverse` for text on dark/ink surfaces, and `text-ak-text` for standard text. Raw black/white breaks when palettes change — a theme with a dark primary and white on-primary text would get white-on-white if you hardcode `text-white`.
21
+
20
22
  **Never use Framer Motion.** CSS animations only. Use `ak-*` animation tokens (`duration-ak-base`, `ease-ak-default`) or effect primitives (`.ak-press`, `.ak-card-glow`).
21
23
 
22
24
  **Never use shadows on containment surfaces.** No `shadow-md` on cards, panels, or dropdowns. Use `border border-ak-border` instead. Shadows are reserved for modals and floating elements only.
@@ -74,6 +76,36 @@ Prefer: class="text-ak-fl-5xl"
74
76
 
75
77
  Static tokens: `text-ak-2xs` · `text-ak-xs` · `text-ak-sm` · `text-ak-base` · `text-ak-lg` · `text-ak-xl` · `text-ak-2xl`
76
78
 
79
+ ### Watermark / Giant Decorative Type — `text-ak-watermark-*`
80
+
81
+ For container-spanning decorative text (brand watermarks behind content). These use `cqi` (container query inline) units with `clamp()` to scale relative to their container width.
82
+
83
+ ```
84
+ Instead of: class="text-[25vw] leading-[0.85] font-black tracking-ak-tighter uppercase whitespace-nowrap select-none pointer-events-none"
85
+ Prefer:
86
+ <div class="ak-watermark-area" aria-hidden="true">
87
+ <span class="ak-watermark text-ak-watermark-lg">Brand</span>
88
+ </div>
89
+ ```
90
+
91
+ The `.ak-watermark-area` primitive sets: container-type inline-size, select-none, pointer-events-none.
92
+ The `.ak-watermark` primitive sets: font-weight 900, tracking-tighter, leading-display, uppercase, nowrap.
93
+
94
+ Pick size by character count:
95
+ | Token | Scale | Best for |
96
+ |---|---|---|
97
+ | `text-ak-watermark-2xs` | 13cqi | 9+ chars (Structura, Celebrate Life) |
98
+ | `text-ak-watermark-xs` | 16cqi | 7-8 chars (Framecut, Routeflow) |
99
+ | `text-ak-watermark-sm` | 19cqi | 5-7 chars (Caliper, Olympus, Terra) |
100
+ | `text-ak-watermark-base` | 21cqi | 5-6 chars (intermediate) |
101
+ | `text-ak-watermark-md` | 24cqi | 4-6 chars (Roast, Maison) |
102
+ | `text-ak-watermark-lg` | 26cqi | 4-5 chars (Relay, Swift, Vinyl) |
103
+ | `text-ak-watermark-xl` | 28cqi | 4-5 chars (Nimble) |
104
+ | `text-ak-watermark-2xl` | 30cqi | 3-5 chars (Void, Orbit, Nexus) |
105
+ | `text-ak-watermark-3xl` | 33cqi | 3-4 chars (Cove) |
106
+ | `text-ak-watermark-4xl` | 36cqi | 2-3 chars (very large) |
107
+ | `text-ak-watermark-5xl` | 40cqi | 2-3 chars (massive) |
108
+
77
109
  ---
78
110
 
79
111
  ## Fluid Spacing — Use `*-ak-fl-*` for Section-Level Spacing
@@ -97,7 +129,7 @@ Space pairs are ideal for section padding (e.g., `py-ak-fl-xl-3xl`), hero spacin
97
129
  - Small internal component spacing (button padding, icon gaps, card chrome)
98
130
  - Spacing that should remain constant regardless of viewport
99
131
 
100
- Static spacing: `*-ak-0` · `*-ak-px` · `*-ak-0_5` · `*-ak-1` · `*-ak-1_5` · `*-ak-2` · `*-ak-2_5` · `*-ak-3` · `*-ak-3_5` · `*-ak-4` · `*-ak-4_5` · `*-ak-5` · `*-ak-5_5` · `*-ak-6` · `*-ak-7` · `*-ak-8` · `*-ak-10` · `*-ak-12` · `*-ak-16` · `*-ak-20` · `*-ak-24`
132
+ Static spacing: `*-ak-0` · `*-ak-px` · `*-ak-0_5` · `*-ak-0_75` · `*-ak-1` · `*-ak-1_25` · `*-ak-1_5` · `*-ak-2` · `*-ak-2_5` · `*-ak-3` · `*-ak-3_5` · `*-ak-4` · `*-ak-4_5` · `*-ak-5` · `*-ak-5_5` · `*-ak-6` · `*-ak-7` · `*-ak-8` · `*-ak-10` · `*-ak-12` · `*-ak-16` · `*-ak-20` · `*-ak-24`
101
133
 
102
134
  ---
103
135
 
@@ -185,12 +217,31 @@ Prefer: class="bg-ak-bg text-ak-text border-ak-border"
185
217
  ### Decorative highlights / loading:
186
218
  `ak-highlight-soft` · `ak-highlight-strong` · `ak-skeleton-base` · `ak-skeleton-shine`
187
219
 
220
+ ### Primary color family:
221
+ `bg-ak-primary` · `bg-ak-primary-hover` · `bg-ak-primary-active` — action backgrounds (button, link hover, active press)
222
+ `text-ak-on-primary` — text ON a primary-colored background (white in light mode, dark in dark mode)
223
+ `bg-ak-primary-subtle` · `bg-ak-primary-subtle-hover` — soft/pastel primary tint for gentle emphasis (badges, pastel buttons, tag backgrounds)
224
+ `ak-primary-50` through `ak-primary-950` — full primary color ramp for fine-grained shading
225
+
188
226
  ### Text:
189
- `text-ak-text` · `text-ak-text-secondary` · `text-ak-text-muted` · `text-ak-text-disabled` · `text-ak-text-inverse`
227
+ `text-ak-text` · `text-ak-text-emphasis` · `text-ak-text-secondary` · `text-ak-text-muted` · `text-ak-text-disabled` · `text-ak-text-inverse` · `text-ak-text-link` · `text-ak-text-placeholder`
228
+
229
+ **Text scale usage:**
230
+ - `ak-text` — primary body text, headings
231
+ - `ak-text-emphasis` — high-emphasis secondary text, slightly softened ink (between text and text-secondary)
232
+ - `ak-text-secondary` — descriptions, supporting copy
233
+ - `ak-text-muted` — timestamps, captions, tertiary info
234
+ - `ak-text-disabled` — disabled controls
235
+ - `ak-text-inverse` — text on dark/ink backgrounds (NOT on primary — use `ak-on-primary` for that)
236
+ - `ak-text-link` — inline hyperlinks
237
+ - `ak-text-placeholder` — input placeholders
190
238
 
191
239
  ### Border:
192
240
  `border-ak-border` · `border-ak-border-subtle` · `border-ak-border-strong` · `border-ak-border-focus`
193
241
 
242
+ ### Overlay:
243
+ `bg-ak-overlay` — semi-transparent backdrop for modals and drawers
244
+
194
245
  ### Neutral scale (for decorative/data elements only):
195
246
  `ak-neutral-0` through `ak-neutral-950` (11 shades)
196
247
 
@@ -223,6 +274,11 @@ Prefer: class="max-w-ak-page mx-auto px-ak-3"
223
274
 
224
275
  ### Max-widths: `max-w-ak-xs` · `sm` · `md` · `lg` · `xl` · `2xl` · `3xl` · `4xl` · `prose` · `page` (80rem)
225
276
  ### Heights: `h-ak-nav` (nav bar) · `h-ak-touch` / `w-ak-touch` (touch target)
277
+ ### Control heights (buttons, inputs, selects):
278
+ `min-h-ak-control-sm` (32px) · `min-h-ak-control-md` (40px) · `min-h-ak-control-lg` (48px) · `min-h-ak-control-xl` (56px) · `min-h-ak-control-2xl` (64px)
279
+
280
+ Also available as `h-ak-control-*` for exact height. Use `min-h-` for buttons (allows text wrap), `h-` for inputs (fixed height).
281
+
226
282
  ### Table rows: `h-ak-row-compact` (40px) · `h-ak-row-default` (48px) · `h-ak-row-comfortable` (52px)
227
283
  ### Page margin: `px-ak-fl-page-margin` — fluid side padding (16px mobile → 80px desktop)
228
284
 
@@ -545,6 +601,56 @@ Use `ak-focus-ring-inset` for elements inside panels where outward rings would c
545
601
 
546
602
  ---
547
603
 
604
+ ## Button & Control Variant Patterns
605
+
606
+ Buttons are composed from three layers: **base** (structure) + **size** (dimensions) + **variant** (colors). Never freestyle button classes — compose from these layers.
607
+
608
+ ### Base (always present):
609
+ ```
610
+ inline-flex items-center justify-center font-semibold rounded-ak-lg cursor-pointer transition-colors duration-ak-base
611
+ ```
612
+
613
+ ### Size scale:
614
+ | Size | Padding | Text | Min Height | Gap |
615
+ |---|---|---|---|---|
616
+ | xs | `py-ak-0_75 px-ak-1_5` | `text-ak-xs` | `min-h-ak-control-sm` | `gap-ak-0_75` |
617
+ | sm | `py-ak-1 px-ak-2` | `text-ak-sm` | `min-h-ak-control-md` | `gap-ak-0_75` |
618
+ | md | `py-ak-1_25 px-ak-2_5` | `text-ak-base` | `min-h-ak-control-lg` | `gap-ak-1` |
619
+ | lg | `py-ak-1_5 px-ak-3` | `text-ak-lg` | `min-h-ak-control-xl` | `gap-ak-1` |
620
+ | xl | `py-ak-2 px-ak-4` | `text-ak-xl` | `min-h-ak-control-2xl` | `gap-ak-1_5` |
621
+
622
+ ### Variant colors (pick ONE per button):
623
+ ```
624
+ Primary: bg-ak-primary text-ak-on-primary hover:bg-ak-primary-hover
625
+ Secondary: bg-ak-surface-2 text-ak-text hover:bg-ak-border
626
+ Ghost: bg-ak-surface text-ak-text border border-ak-border hover:bg-ak-surface-2
627
+ Soft: bg-ak-primary-subtle text-ak-text hover:bg-ak-primary-subtle-hover
628
+ Link: bg-transparent text-ak-primary hover:bg-ak-primary-subtle hover:underline
629
+ Destructive: bg-ak-danger text-ak-text-inverse hover:bg-ak-danger/90
630
+ ```
631
+
632
+ ### Hover state patterns:
633
+ - **Color shift** (secondary, ghost, soft): Change background one step darker via semantic tokens
634
+ - **Invert** (primary, ink): Swap fill/text and add an inset ring — `hover:bg-ak-surface hover:text-ak-primary hover:shadow-[inset_0_0_0_1.5px_var(--color-ak-primary)]`
635
+ - **Never use opacity as hover** — it's not accessible. Use a visible color change.
636
+
637
+ ### Disabled state:
638
+ Add `opacity-50 cursor-not-allowed` and the `disabled` attribute. Never change colors for disabled — the opacity communicates the state.
639
+
640
+ ### Icon-only buttons:
641
+ Use explicit `w-ak-*` and `h-ak-*` instead of padding. Example: `w-ak-5 h-ak-5 p-0` for a sm icon button. Always add `aria-label`.
642
+
643
+ ### Complete example:
644
+ ```html
645
+ <!-- Primary md button with leading icon -->
646
+ <button class="inline-flex items-center justify-center font-semibold rounded-ak-lg cursor-pointer transition-colors duration-ak-base py-ak-1_25 px-ak-2_5 text-ak-base min-h-ak-control-lg gap-ak-1 bg-ak-primary text-ak-on-primary hover:bg-ak-primary-hover ak-focus-ring">
647
+ <i class="ph ph-plus shrink-0" aria-hidden="true" />
648
+ Add item
649
+ </button>
650
+ ```
651
+
652
+ ---
653
+
548
654
  ## Chart Colors
549
655
 
550
656
  Six colorblind-safe chart colors (Tableau 10 derived). Use for data visualization series:
@@ -585,8 +691,8 @@ Use `ak-tabular-nums` on any element displaying numbers in columns (stat cards,
585
691
  <div class="ak-grid" style="--ak-grid-min: 280px">
586
692
  <div class="p-ak-fl-md rounded-ak-md bg-ak-surface border border-ak-border-subtle">
587
693
 
588
- <!-- Button -->
589
- <button class="bg-ak-neutral-900 text-white px-ak-3 py-ak-1 rounded-ak-full text-ak-base font-semibold hover:bg-ak-neutral-800 transition-colors ak-focus-ring">
694
+ <!-- Button (primary) -->
695
+ <button class="inline-flex items-center justify-center bg-ak-primary text-ak-on-primary px-ak-2_5 py-ak-1_25 min-h-ak-control-lg rounded-ak-lg text-ak-base font-semibold hover:bg-ak-primary-hover transition-colors duration-ak-base ak-focus-ring">
590
696
 
591
697
  <!-- Icon -->
592
698
  <svg class="size-ak-icon-lg">
@@ -662,14 +768,62 @@ Import the palettes file and add a `data-ak-theme` attribute:
662
768
  ```
663
769
  Available: `ocean-blue` · `forest-gold` · `minimal-violet` · `warm-earth` · `tangerine` · `slate-pro` · `emerald-saas` · `astral-violet` · `midnight` · `ember-dark` · `obsidian` · `deep-teal`
664
770
 
665
- ### Method 2: Custom Override
666
- Override these variables in your `globals.css` `@theme` block (v4) or `:root` (v3):
771
+ ### Method 2: Custom Theme Palette
772
+ Create a `[data-ak-theme="your-brand"]` block and override the semantic tokens. Apply it to any container — `<html>`, a `<div>`, or a layout wrapper. Palettes cascade to all children.
773
+
667
774
  ```css
668
- --color-ak-bg, --color-ak-surface, --color-ak-text, --color-ak-text-secondary,
669
- --color-ak-primary, --color-ak-primary-hover, --color-ak-primary-active,
670
- --color-ak-on-primary, --color-ak-border, --color-ak-border-subtle, --color-ak-border-strong
775
+ [data-ak-theme="your-brand"] {
776
+ /* ── Required: core surfaces ── */
777
+ --color-ak-bg: #your-page-bg;
778
+ --color-ak-surface: #your-card-bg;
779
+ --color-ak-surface-2: #your-secondary-surface;
780
+ --color-ak-hover: #your-hover-surface;
781
+
782
+ /* ── Required: text scale ── */
783
+ --color-ak-text: #your-ink;
784
+ --color-ak-text-emphasis: #your-high-emphasis; /* between text and text-secondary */
785
+ --color-ak-text-secondary: #your-secondary-text;
786
+ --color-ak-text-muted: #your-muted-text;
787
+ --color-ak-text-inverse: #your-inverse-text; /* text on dark/ink backgrounds */
788
+
789
+ /* ── Required: primary action color ── */
790
+ --color-ak-primary: #your-brand-color;
791
+ --color-ak-primary-hover: #your-brand-darker;
792
+ --color-ak-primary-active: #your-brand-darkest;
793
+ --color-ak-on-primary: #ffffff; /* text ON primary bg */
794
+ --color-ak-primary-subtle: #your-brand-pastel; /* soft tint for badges, soft buttons */
795
+ --color-ak-primary-subtle-hover: #your-brand-pastel-darker;
796
+
797
+ /* ── Required: borders ── */
798
+ --color-ak-border: #your-border;
799
+ --color-ak-border-subtle: #your-light-border;
800
+ --color-ak-border-strong: #your-strong-border;
801
+
802
+ /* ── Recommended: full primary ramp (enables fine-grained shading) ── */
803
+ --color-ak-primary-50: #lightest;
804
+ --color-ak-primary-100: ...;
805
+ --color-ak-primary-200: ...;
806
+ /* ... through --color-ak-primary-950 */
807
+
808
+ /* ── Optional: status colors (defaults work for most brands) ── */
809
+ --color-ak-success: ...; --color-ak-warning: ...; --color-ak-danger: ...; --color-ak-info: ...;
810
+ }
671
811
  ```
672
812
 
813
+ ```html
814
+ <div data-ak-theme="your-brand">
815
+ <!-- All ak-* classes inside here use your palette -->
816
+ </div>
817
+ ```
818
+
819
+ **Key rules for palette authors:**
820
+ 1. Every button, card, and text element uses `ak-*` semantic tokens — if you set the palette correctly, the entire UI re-themes automatically
821
+ 2. `--color-ak-on-primary` MUST contrast with `--color-ak-primary` — this is the text color on primary buttons
822
+ 3. `--color-ak-text-inverse` MUST contrast with `--color-ak-text` — this is for text on ink/dark surfaces
823
+ 4. `--color-ak-primary-subtle` should be a very light tint of your primary (10-15% opacity equivalent)
824
+ 5. Populate the full primary ramp (50-950) if you need fine-grained variants beyond the semantic tokens
825
+ 6. Brand-specific extras that don't map to any ak-* semantic (custom pastel chips, brand shadows, display fonts) go in a separate scoped CSS file — not in the palette block
826
+
673
827
  ### Light Palettes
674
828
 
675
829
  **AstralKit Default (Violet)**
@@ -61,9 +61,11 @@
61
61
  --color-ak-overlay: rgba(0, 0, 0, 0.5);
62
62
  --color-ak-on-primary: #ffffff;
63
63
  --color-ak-primary-subtle: #f5f5f5;
64
+ --color-ak-primary-subtle-hover: #e5e5e5;
64
65
 
65
66
  /* ── Semantic text ── */
66
67
  --color-ak-text: #171717;
68
+ --color-ak-text-emphasis: #2b2b2b;
67
69
  --color-ak-text-secondary: #525252;
68
70
  --color-ak-text-muted: #a3a3a3;
69
71
  --color-ak-text-disabled: #d4d4d4;
@@ -101,18 +103,26 @@
101
103
  /* ── Type scale (static) ── */
102
104
  --text-ak-2xs: 0.6875rem;
103
105
  --text-ak-xs: 0.75rem;
106
+ --text-ak-xs_5: 0.8125rem;
104
107
  --text-ak-sm: 0.875rem;
108
+ --text-ak-sm_5: 0.9375rem;
105
109
  --text-ak-base: 1rem;
106
110
  --text-ak-lg: 1.125rem;
107
111
  --text-ak-xl: 1.25rem;
112
+ --text-ak-xl_5: 1.375rem;
108
113
  --text-ak-2xl: 1.5rem;
114
+ --text-ak-2xl_5: 1.625rem;
109
115
  --text-ak-3xl: 2rem;
110
116
  --text-ak-4xl: 2.5rem;
117
+ --text-ak-4xl_5: 2.75rem;
111
118
  --text-ak-5xl: 3rem;
112
119
  --text-ak-6xl: 3.75rem;
120
+ --text-ak-6xl_5: 4rem;
113
121
  --text-ak-7xl: 4.5rem;
122
+ --text-ak-7xl_5: 5.25rem;
114
123
  --text-ak-8xl: 6rem;
115
124
  --text-ak-9xl: 7rem;
125
+ --text-ak-10xl: 8rem;
116
126
 
117
127
  /* ── Fluid type scale (viewport: 320px → 1400px) ──
118
128
  One class, zero breakpoints. Use text-ak-fl-* instead of text-ak-*.
@@ -152,15 +162,20 @@
152
162
  --text-ak-display-9xl: clamp(5.5rem, 3.06rem + 7.64vw, 10rem);
153
163
 
154
164
  /* ── Line Height ── */
155
- --leading-ak-display: 0.85;
156
- --leading-ak-tighter: 1.1;
157
- --leading-ak-none: 1;
158
- --leading-ak-tight: 1.25;
159
- --leading-ak-snug: 1.375;
160
- --leading-ak-normal: 1.5;
161
- --leading-ak-relaxed: 1.625;
162
- --leading-ak-prose: 1.75;
163
- --leading-ak-loose: 2;
165
+ --leading-ak-display: 0.85;
166
+ --leading-ak-squeezed: 0.92;
167
+ --leading-ak-condensed: 0.95;
168
+ --leading-ak-none: 1;
169
+ --leading-ak-fitted: 1.02;
170
+ --leading-ak-compact: 1.05;
171
+ --leading-ak-tighter: 1.1;
172
+ --leading-ak-snugger: 1.2;
173
+ --leading-ak-tight: 1.25;
174
+ --leading-ak-snug: 1.375;
175
+ --leading-ak-normal: 1.5;
176
+ --leading-ak-relaxed: 1.625;
177
+ --leading-ak-prose: 1.75;
178
+ --leading-ak-loose: 2;
164
179
 
165
180
  /* ── Letter Spacing ── */
166
181
  --tracking-ak-tighter: -0.05em;
@@ -176,7 +191,9 @@
176
191
  --spacing-ak-0: 0rem;
177
192
  --spacing-ak-px: 0.0625rem;
178
193
  --spacing-ak-0_5: 0.25rem;
194
+ --spacing-ak-0_75: 0.375rem;
179
195
  --spacing-ak-1: 0.5rem;
196
+ --spacing-ak-1_25: 0.625rem;
180
197
  --spacing-ak-1_5: 0.75rem;
181
198
  --spacing-ak-2: 1rem;
182
199
  --spacing-ak-2_5: 1.25rem;
@@ -219,6 +236,7 @@
219
236
  --height-ak-control-md: 2.5rem; /* 40px — STANDARD */
220
237
  --height-ak-control-lg: 3rem; /* 48px — prominent CTAs */
221
238
  --height-ak-control-xl: 3.5rem; /* 56px — hero CTAs */
239
+ --height-ak-control-2xl: 4rem; /* 64px — oversized CTAs */
222
240
 
223
241
  /* ── Table row heights ── */
224
242
  --height-ak-row-compact: 2.5rem; /* 40px */
@@ -544,9 +562,11 @@
544
562
  --color-ak-overlay: rgba(0,0,0,0.7);
545
563
  --color-ak-on-primary: #111113;
546
564
  --color-ak-primary-subtle: rgba(129, 140, 248, 0.15);
565
+ --color-ak-primary-subtle-hover: rgba(129, 140, 248, 0.24);
547
566
 
548
567
  /* ── Text ── */
549
568
  --color-ak-text: #f4f4f5;
569
+ --color-ak-text-emphasis: #d4d4d8;
550
570
  --color-ak-text-secondary: #a1a1aa;
551
571
  --color-ak-text-muted: #71717a;
552
572
  --color-ak-text-disabled: #52525b;
@@ -63,9 +63,11 @@
63
63
  --color-ak-overlay: rgba(0, 0, 0, 0.5);
64
64
  --color-ak-on-primary: #ffffff;
65
65
  --color-ak-primary-subtle: #f5f5f5;
66
+ --color-ak-primary-subtle-hover: #e5e5e5;
66
67
 
67
68
  /* ── Semantic text ── */
68
69
  --color-ak-text: #171717;
70
+ --color-ak-text-emphasis: #2b2b2b;
69
71
  --color-ak-text-secondary: #525252;
70
72
  --color-ak-text-muted: #a3a3a3;
71
73
  --color-ak-text-disabled: #d4d4d4;
@@ -103,18 +105,26 @@
103
105
  /* ── Type scale (static) ── */
104
106
  --text-ak-2xs: 0.6875rem;
105
107
  --text-ak-xs: 0.75rem;
108
+ --text-ak-xs_5: 0.8125rem;
106
109
  --text-ak-sm: 0.875rem;
110
+ --text-ak-sm_5: 0.9375rem;
107
111
  --text-ak-base: 1rem;
108
112
  --text-ak-lg: 1.125rem;
109
113
  --text-ak-xl: 1.25rem;
114
+ --text-ak-xl_5: 1.375rem;
110
115
  --text-ak-2xl: 1.5rem;
116
+ --text-ak-2xl_5: 1.625rem;
111
117
  --text-ak-3xl: 2rem;
112
118
  --text-ak-4xl: 2.5rem;
119
+ --text-ak-4xl_5: 2.75rem;
113
120
  --text-ak-5xl: 3rem;
114
121
  --text-ak-6xl: 3.75rem;
122
+ --text-ak-6xl_5: 4rem;
115
123
  --text-ak-7xl: 4.5rem;
124
+ --text-ak-7xl_5: 5.25rem;
116
125
  --text-ak-8xl: 6rem;
117
126
  --text-ak-9xl: 7rem;
127
+ --text-ak-10xl: 8rem;
118
128
 
119
129
  /* ── Fluid type scale (viewport: 320px → 1400px) ──
120
130
  One class, zero breakpoints. Use text-ak-fl-* instead of text-ak-*.
@@ -153,16 +163,37 @@
153
163
  --text-ak-display-8xl: clamp(5rem, 3.06rem + 6.94vw, 9rem);
154
164
  --text-ak-display-9xl: clamp(5.5rem, 3.06rem + 7.64vw, 10rem);
155
165
 
166
+ /* ── Watermark / Giant Decorative Type ──
167
+ Container-scaled sizes for decorative watermarks. Uses cqi
168
+ (container query inline) so text fits its container, not the viewport.
169
+ Parent must be a container (ak-watermark primitive handles this). ── */
170
+ --text-ak-watermark-2xs: clamp(1rem, 13cqi, 13rem);
171
+ --text-ak-watermark-xs: clamp(1rem, 16cqi, 16rem);
172
+ --text-ak-watermark-sm: clamp(1rem, 19cqi, 20rem);
173
+ --text-ak-watermark-base: clamp(1rem, 21cqi, 22rem);
174
+ --text-ak-watermark-md: clamp(1rem, 24cqi, 26rem);
175
+ --text-ak-watermark-lg: clamp(1rem, 26cqi, 28rem);
176
+ --text-ak-watermark-xl: clamp(1rem, 28cqi, 30rem);
177
+ --text-ak-watermark-2xl: clamp(1rem, 30cqi, 34rem);
178
+ --text-ak-watermark-3xl: clamp(1rem, 33cqi, 38rem);
179
+ --text-ak-watermark-4xl: clamp(1rem, 36cqi, 42rem);
180
+ --text-ak-watermark-5xl: clamp(1rem, 40cqi, 48rem);
181
+
156
182
  /* ── Line Height ── */
157
- --leading-ak-display: 0.85;
158
- --leading-ak-tighter: 1.1;
159
- --leading-ak-none: 1;
160
- --leading-ak-tight: 1.25;
161
- --leading-ak-snug: 1.375;
162
- --leading-ak-normal: 1.5;
163
- --leading-ak-relaxed: 1.625;
164
- --leading-ak-prose: 1.75;
165
- --leading-ak-loose: 2;
183
+ --leading-ak-display: 0.85;
184
+ --leading-ak-squeezed: 0.92;
185
+ --leading-ak-condensed: 0.95;
186
+ --leading-ak-none: 1;
187
+ --leading-ak-fitted: 1.02;
188
+ --leading-ak-compact: 1.05;
189
+ --leading-ak-tighter: 1.1;
190
+ --leading-ak-snugger: 1.2;
191
+ --leading-ak-tight: 1.25;
192
+ --leading-ak-snug: 1.375;
193
+ --leading-ak-normal: 1.5;
194
+ --leading-ak-relaxed: 1.625;
195
+ --leading-ak-prose: 1.75;
196
+ --leading-ak-loose: 2;
166
197
 
167
198
  /* ── Letter Spacing ── */
168
199
  --tracking-ak-tighter: -0.05em;
@@ -178,7 +209,9 @@
178
209
  --spacing-ak-0: 0rem;
179
210
  --spacing-ak-px: 0.0625rem;
180
211
  --spacing-ak-0_5: 0.25rem;
212
+ --spacing-ak-0_75: 0.375rem;
181
213
  --spacing-ak-1: 0.5rem;
214
+ --spacing-ak-1_25: 0.625rem;
182
215
  --spacing-ak-1_5: 0.75rem;
183
216
  --spacing-ak-2: 1rem;
184
217
  --spacing-ak-2_5: 1.25rem;
@@ -221,6 +254,7 @@
221
254
  --height-ak-control-md: 2.5rem; /* 40px — STANDARD */
222
255
  --height-ak-control-lg: 3rem; /* 48px — prominent CTAs */
223
256
  --height-ak-control-xl: 3.5rem; /* 56px — hero CTAs */
257
+ --height-ak-control-2xl: 4rem; /* 64px — oversized CTAs */
224
258
 
225
259
  /* ── Table row heights ── */
226
260
  --height-ak-row-compact: 2.5rem; /* 40px */
@@ -544,9 +578,11 @@
544
578
  --color-ak-overlay: rgba(0,0,0,0.7);
545
579
  --color-ak-on-primary: #111113;
546
580
  --color-ak-primary-subtle: rgba(129, 140, 248, 0.15);
581
+ --color-ak-primary-subtle-hover: rgba(129, 140, 248, 0.24);
547
582
 
548
583
  /* ── Text ── */
549
584
  --color-ak-text: #f4f4f5;
585
+ --color-ak-text-emphasis: #d4d4d8;
550
586
  --color-ak-text-secondary: #a1a1aa;
551
587
  --color-ak-text-muted: #71717a;
552
588
  --color-ak-text-disabled: #52525b;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "astralkit",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "Design tokens and component primitives for accessible UI — Tailwind CSS v3 & v4",
5
5
  "type": "module",
6
6
  "exports": {
@@ -29,7 +29,7 @@
29
29
  ],
30
30
  "dependencies": {
31
31
  "clsx": "^2.1.0",
32
- "tailwind-merge": "^2.2.0"
32
+ "tailwind-merge": "^2.2.0 || ^3.0.0"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "tailwindcss": ">=3.0.0"
@@ -39,11 +39,17 @@
39
39
  "optional": false
40
40
  }
41
41
  },
42
- "keywords": ["astralkit", "design-tokens", "tailwind", "css", "ui"],
42
+ "keywords": [
43
+ "astralkit",
44
+ "design-tokens",
45
+ "tailwind",
46
+ "css",
47
+ "ui"
48
+ ],
43
49
  "homepage": "https://astralkit.com",
44
50
  "repository": {
45
51
  "type": "git",
46
- "url": "https://github.com/astral-kit/astralkit"
52
+ "url": "git+https://github.com/astral-kit/astralkit.git"
47
53
  },
48
54
  "license": "SEE LICENSE IN LICENSE",
49
55
  "author": "Blue Beacon Creative LLC",
package/palettes.css CHANGED
@@ -297,3 +297,32 @@
297
297
  --shadow-ak-xs: none;
298
298
  --shadow-ak-sm: none;
299
299
  }
300
+
301
+ /* ─── Brand Design System Palettes ─── */
302
+
303
+ [data-ak-theme="logozap"] {
304
+ --color-ak-bg: #FAFAF7;
305
+ --color-ak-surface: #FFFFFF;
306
+ --color-ak-surface-2: #F0EFEA;
307
+ --color-ak-text: #0A0A0A;
308
+ --color-ak-text-secondary: #5A5A5A;
309
+ --color-ak-text-muted: #8C8C8C;
310
+ --color-ak-text-disabled: #C4C2BA;
311
+ --color-ak-text-placeholder: #8C8C8C;
312
+ --color-ak-primary: #1E7BFF;
313
+ --color-ak-primary-hover: #0B4FD9;
314
+ --color-ak-primary-active: #0942B0;
315
+ --color-ak-on-primary: #FFFFFF;
316
+ --color-ak-primary-subtle: #CFE3FF;
317
+ --color-ak-border: #E4E2DA;
318
+ --color-ak-border-subtle: #EEEDE8;
319
+ --color-ak-border-strong: #5A5A5A;
320
+ --color-ak-border-focus: #1E7BFF;
321
+ --color-ak-text-link: #1E7BFF;
322
+ --color-ak-hover: #F0EFEA;
323
+ --color-ak-active: #E4E2DA;
324
+ --color-ak-danger: #EF4444;
325
+ --color-ak-success: #22C55E;
326
+ --color-ak-warning: #F59E0B;
327
+ --color-ak-info: #3B82F6;
328
+ }
@@ -298,6 +298,26 @@
298
298
  color: var(--color-ak-text);
299
299
  }
300
300
 
301
+ /* -- Watermark Primitive --
302
+ Decorative container-spanning text. Pair with text-ak-watermark-* size token.
303
+ Wrap in .ak-watermark-area so cqi units size relative to the container.
304
+ Usage:
305
+ <div class="ak-watermark-area" aria-hidden="true">
306
+ <span class="ak-watermark text-ak-watermark-lg">Brand</span>
307
+ </div> */
308
+ .ak-watermark-area {
309
+ container-type: inline-size;
310
+ user-select: none;
311
+ pointer-events: none;
312
+ }
313
+ .ak-watermark {
314
+ font-weight: 900;
315
+ letter-spacing: var(--tracking-ak-tighter);
316
+ line-height: var(--leading-ak-display);
317
+ text-transform: uppercase;
318
+ white-space: nowrap;
319
+ }
320
+
301
321
  /* Panel section headings — add letter-spacing, keep original font-size */
302
322
  [data-ak-panel] h3.text-ak-base.font-bold {
303
323
  letter-spacing: var(--tracking-ak-section);
package/tailwind.cjs CHANGED
@@ -22,7 +22,11 @@ const AK_SPACING = {
22
22
  'ak-px': 'var(--spacing-ak-px)',
23
23
  'ak-0_5': 'var(--spacing-ak-0_5)',
24
24
  'ak-0.5': 'var(--spacing-ak-0_5)',
25
+ 'ak-0_75': 'var(--spacing-ak-0_75)',
26
+ 'ak-0.75': 'var(--spacing-ak-0_75)',
25
27
  'ak-1': 'var(--spacing-ak-1)',
28
+ 'ak-1_25': 'var(--spacing-ak-1_25)',
29
+ 'ak-1.25': 'var(--spacing-ak-1_25)',
26
30
  'ak-1_5': 'var(--spacing-ak-1_5)',
27
31
  'ak-1.5': 'var(--spacing-ak-1_5)',
28
32
  'ak-2': 'var(--spacing-ak-2)',
@@ -105,10 +109,12 @@ module.exports = plugin(
105
109
  'ak-elevated': 'var(--color-ak-elevated)',
106
110
  'ak-on-primary': 'var(--color-ak-on-primary)',
107
111
  'ak-primary-subtle': 'var(--color-ak-primary-subtle)',
112
+ 'ak-primary-subtle-hover': 'var(--color-ak-primary-subtle-hover)',
108
113
  'ak-overlay': 'var(--color-ak-overlay)',
109
114
 
110
115
  // Semantic text
111
116
  'ak-text': 'var(--color-ak-text)',
117
+ 'ak-text-emphasis': 'var(--color-ak-text-emphasis)',
112
118
  'ak-text-secondary': 'var(--color-ak-text-secondary)',
113
119
  'ak-text-muted': 'var(--color-ak-text-muted)',
114
120
  'ak-text-disabled': 'var(--color-ak-text-disabled)',
@@ -190,19 +196,34 @@ module.exports = plugin(
190
196
  fontSize: {
191
197
  // Static scale
192
198
  'ak-2xs': 'var(--text-ak-2xs)',
193
- 'ak-xs': 'var(--text-ak-xs)',
194
- 'ak-sm': 'var(--text-ak-sm)',
195
- 'ak-base': 'var(--text-ak-base)',
199
+ 'ak-xs': 'var(--text-ak-xs)',
200
+ 'ak-xs_5': 'var(--text-ak-xs_5)',
201
+ 'ak-xs.5': 'var(--text-ak-xs_5)',
202
+ 'ak-sm': 'var(--text-ak-sm)',
203
+ 'ak-sm_5': 'var(--text-ak-sm_5)',
204
+ 'ak-sm.5': 'var(--text-ak-sm_5)',
205
+ 'ak-base': 'var(--text-ak-base)',
196
206
  'ak-lg': 'var(--text-ak-lg)',
197
- 'ak-xl': 'var(--text-ak-xl)',
198
- 'ak-2xl': 'var(--text-ak-2xl)',
199
- 'ak-3xl': 'var(--text-ak-3xl)',
200
- 'ak-4xl': 'var(--text-ak-4xl)',
201
- 'ak-5xl': 'var(--text-ak-5xl)',
202
- 'ak-6xl': 'var(--text-ak-6xl)',
203
- 'ak-7xl': 'var(--text-ak-7xl)',
204
- 'ak-8xl': 'var(--text-ak-8xl)',
205
- 'ak-9xl': 'var(--text-ak-9xl)',
207
+ 'ak-xl': 'var(--text-ak-xl)',
208
+ 'ak-xl_5': 'var(--text-ak-xl_5)',
209
+ 'ak-xl.5': 'var(--text-ak-xl_5)',
210
+ 'ak-2xl': 'var(--text-ak-2xl)',
211
+ 'ak-2xl_5': 'var(--text-ak-2xl_5)',
212
+ 'ak-2xl.5': 'var(--text-ak-2xl_5)',
213
+ 'ak-3xl': 'var(--text-ak-3xl)',
214
+ 'ak-4xl': 'var(--text-ak-4xl)',
215
+ 'ak-4xl_5': 'var(--text-ak-4xl_5)',
216
+ 'ak-4xl.5': 'var(--text-ak-4xl_5)',
217
+ 'ak-5xl': 'var(--text-ak-5xl)',
218
+ 'ak-6xl': 'var(--text-ak-6xl)',
219
+ 'ak-6xl_5': 'var(--text-ak-6xl_5)',
220
+ 'ak-6xl.5': 'var(--text-ak-6xl_5)',
221
+ 'ak-7xl': 'var(--text-ak-7xl)',
222
+ 'ak-7xl_5': 'var(--text-ak-7xl_5)',
223
+ 'ak-7xl.5': 'var(--text-ak-7xl_5)',
224
+ 'ak-8xl': 'var(--text-ak-8xl)',
225
+ 'ak-9xl': 'var(--text-ak-9xl)',
226
+ 'ak-10xl': 'var(--text-ak-10xl)',
206
227
  // Fluid scale
207
228
  'ak-fl-xs': 'clamp(0.6875rem, 0.67rem + 0.06vw, 0.75rem)',
208
229
  'ak-fl-sm': 'clamp(0.75rem, 0.71rem + 0.12vw, 0.875rem)',
@@ -231,13 +252,30 @@ module.exports = plugin(
231
252
  'ak-display-7xl': 'clamp(4.5rem, 3.06rem + 5.56vw, 8rem)',
232
253
  'ak-display-8xl': 'clamp(5rem, 3.06rem + 6.94vw, 9rem)',
233
254
  'ak-display-9xl': 'clamp(5.5rem, 3.06rem + 7.64vw, 10rem)',
255
+
256
+ 'ak-watermark-2xs': 'clamp(1rem, 13cqi, 13rem)',
257
+ 'ak-watermark-xs': 'clamp(1rem, 16cqi, 16rem)',
258
+ 'ak-watermark-sm': 'clamp(1rem, 19cqi, 20rem)',
259
+ 'ak-watermark-base': 'clamp(1rem, 21cqi, 22rem)',
260
+ 'ak-watermark-md': 'clamp(1rem, 24cqi, 26rem)',
261
+ 'ak-watermark-lg': 'clamp(1rem, 26cqi, 28rem)',
262
+ 'ak-watermark-xl': 'clamp(1rem, 28cqi, 30rem)',
263
+ 'ak-watermark-2xl': 'clamp(1rem, 30cqi, 34rem)',
264
+ 'ak-watermark-3xl': 'clamp(1rem, 33cqi, 38rem)',
265
+ 'ak-watermark-4xl': 'clamp(1rem, 36cqi, 42rem)',
266
+ 'ak-watermark-5xl': 'clamp(1rem, 40cqi, 48rem)',
234
267
  },
235
268
 
236
269
  /* ── Line Height ── */
237
270
  lineHeight: {
238
- 'ak-display': 'var(--leading-ak-display)',
271
+ 'ak-display': 'var(--leading-ak-display)',
272
+ 'ak-squeezed': 'var(--leading-ak-squeezed)',
273
+ 'ak-condensed': 'var(--leading-ak-condensed)',
274
+ 'ak-none': 'var(--leading-ak-none)',
275
+ 'ak-fitted': 'var(--leading-ak-fitted)',
276
+ 'ak-compact': 'var(--leading-ak-compact)',
239
277
  'ak-tighter': 'var(--leading-ak-tighter)',
240
- 'ak-none': 'var(--leading-ak-none)',
278
+ 'ak-snugger': 'var(--leading-ak-snugger)',
241
279
  'ak-tight': 'var(--leading-ak-tight)',
242
280
  'ak-snug': 'var(--leading-ak-snug)',
243
281
  'ak-normal': 'var(--leading-ak-normal)',
@@ -337,7 +375,8 @@ module.exports = plugin(
337
375
  'ak-control-sm': 'var(--height-ak-control-sm)',
338
376
  'ak-control-md': 'var(--height-ak-control-md)',
339
377
  'ak-control-lg': 'var(--height-ak-control-lg)',
340
- 'ak-control-xl': 'var(--height-ak-control-xl)',
378
+ 'ak-control-xl': 'var(--height-ak-control-xl)',
379
+ 'ak-control-2xl': 'var(--height-ak-control-2xl)',
341
380
  'ak-row-compact': 'var(--height-ak-row-compact)',
342
381
  'ak-row-default': 'var(--height-ak-row-default)',
343
382
  'ak-row-comfortable': 'var(--height-ak-row-comfortable)',
@@ -353,6 +392,7 @@ module.exports = plugin(
353
392
  'ak-control-md': 'var(--height-ak-control-md)',
354
393
  'ak-control-lg': 'var(--height-ak-control-lg)',
355
394
  'ak-control-xl': 'var(--height-ak-control-xl)',
395
+ 'ak-control-2xl': 'var(--height-ak-control-2xl)',
356
396
  'ak-row-compact': 'var(--height-ak-row-compact)',
357
397
  'ak-row-default': 'var(--height-ak-row-default)',
358
398
  'ak-row-comfortable': 'var(--height-ak-row-comfortable)',