@mohasinac/appkit 4.54.0 → 4.55.0-next.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/dist/styles.css CHANGED
@@ -650,6 +650,161 @@
650
650
  --appkit-shadow-glow-pink: 0 0 0 1px rgba(244,63,94,0.18), 0 4px 20px -4px rgba(244,63,94,0.30);
651
651
  }
652
652
 
653
+ /* --- Theme — Technical Dark ([data-theme="technical-dark"]) --------------- */
654
+ /* Developer-tool identity: graphite surfaces, hairline borders, a mono-forward
655
+ type stack, and accents from a syntax palette (keyword violet, string green,
656
+ number amber, error red) reused semantically for difficulty badges,
657
+ submission verdicts and status chips.
658
+
659
+ Mirrors src/tokens/themes/technical-dark.ts — values must stay identical or
660
+ the first paint disagrees with the hydrated theme.
661
+
662
+ Contrast on --appkit-color-bg (#0b0d10), measured: text 15.82:1,
663
+ muted 7.72:1, faint 4.68:1, primary 6.53:1, lowest status 7.01:1. */
664
+ [data-theme="technical-dark"] {
665
+ --appkit-color-primary: #7c8cff;
666
+ --appkit-color-primary-50: #eef0ff;
667
+ --appkit-color-primary-100: #e0e4ff;
668
+ --appkit-color-primary-200: #c7cdff;
669
+ --appkit-color-primary-300: #a5aeff;
670
+ --appkit-color-primary-400: #8e99ff;
671
+ --appkit-color-primary-500: #7c8cff;
672
+ --appkit-color-primary-600: #5a68e8;
673
+ --appkit-color-primary-700: #4650c4;
674
+ --appkit-color-primary-800: #373f9c;
675
+ --appkit-color-primary-900: #2b317a;
676
+ --appkit-color-primary-950: #171a45;
677
+
678
+ --appkit-color-secondary: #56d39a;
679
+ --appkit-color-secondary-50: #ecfdf5;
680
+ --appkit-color-secondary-100: #d1fae5;
681
+ --appkit-color-secondary-200: #a7f3d0;
682
+ --appkit-color-secondary-300: #7ee7b8;
683
+ --appkit-color-secondary-400: #56d39a;
684
+ --appkit-color-secondary-500: #34b87d;
685
+ --appkit-color-secondary-600: #1f9664;
686
+ --appkit-color-secondary-700: #187752;
687
+ --appkit-color-secondary-800: #155e42;
688
+ --appkit-color-secondary-900: #124b36;
689
+ --appkit-color-secondary-950: #062a1d;
690
+
691
+ --appkit-color-bg: #0b0d10;
692
+ --appkit-color-surface: #13161b;
693
+ --appkit-color-surface-elevated: rgba(19, 22, 27, 0.92);
694
+ --appkit-color-surface-input: rgba(27, 31, 38, 0.7);
695
+
696
+ --appkit-color-surface-hover: rgba(148, 163, 184, 0.1);
697
+ --appkit-color-surface-raised: rgba(27, 31, 38, 0.8);
698
+ --appkit-color-primary-surface: rgba(124, 140, 255, 0.16);
699
+
700
+ --appkit-color-border: #242a33;
701
+ --appkit-color-border-subtle: rgba(36, 42, 51, 0.6);
702
+
703
+ --appkit-color-text: #e4e8ee;
704
+ --appkit-color-text-muted: #9aa4b2;
705
+ --appkit-color-text-faint: #747d8c;
706
+ /* Dark ink on the violet fill: 6.53:1, where white measures 2.98:1 and
707
+ fails. Declared here AND in the TS record or first paint disagrees. */
708
+ --appkit-color-text-on-primary: #0b0d10;
709
+
710
+ --appkit-color-success: #4ade80;
711
+ --appkit-color-success-surface: rgba(22, 101, 68, 0.22);
712
+ --appkit-color-warning: #f2b544;
713
+ --appkit-color-warning-surface: rgba(120, 78, 10, 0.22);
714
+ --appkit-color-error: #ff6b6b;
715
+ --appkit-color-error-surface: rgba(140, 30, 30, 0.22);
716
+ --appkit-color-info: #58b4ff;
717
+ --appkit-color-info-surface: rgba(12, 74, 110, 0.22);
718
+
719
+ /* Amber, deliberately not a status or brand hue — a focus ring that doubles
720
+ as an error colour is unreadable on an invalid field. */
721
+ --appkit-color-focus-ring: #ffb86b;
722
+ --appkit-shadow-glow: 0 0 0 1px rgba(124,140,255,0.14), 0 4px 16px -6px rgba(124,140,255,0.2);
723
+ --appkit-shadow-glow-pink: 0 0 0 1px rgba(86,211,154,0.14), 0 4px 18px -6px rgba(86,211,154,0.22);
724
+
725
+ /* Mono-forward: display/sans are monospace for headings, labels, IDs and
726
+ tables; editorial carries the reading face for long lesson prose. */
727
+ --appkit-font-display: var(--font-mono), "JetBrains Mono", "IBM Plex Mono", ui-monospace, "SFMono-Regular", Consolas, monospace;
728
+ --appkit-font-sans: var(--font-mono), "JetBrains Mono", "IBM Plex Mono", ui-monospace, "SFMono-Regular", Consolas, monospace;
729
+ --appkit-font-editorial: var(--font-body), ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
730
+ --appkit-font-mono: var(--font-mono), "JetBrains Mono", "IBM Plex Mono", ui-monospace, "SFMono-Regular", Consolas, monospace;
731
+ }
732
+
733
+ /* --- Theme — Technical Light ([data-theme="technical-light"]) ------------- */
734
+ /* The matched light counterpart. Every accent is RE-DARKENED rather than
735
+ reused: the dark preset's #7c8cff measures 2.88:1 on this ground and fails
736
+ AA, and its #ffb86b focus ring measures 1.65:1 — an invisible focus ring is
737
+ a keyboard trap.
738
+
739
+ Mirrors src/tokens/themes/technical-light.ts.
740
+
741
+ Contrast on --appkit-color-bg (#fbfbfa), measured: text 17.15:1,
742
+ muted 5.84:1, faint 4.67:1, primary 5.38:1, lowest status 4.80:1. */
743
+ [data-theme="technical-light"] {
744
+ --appkit-color-primary: #4b5bd6;
745
+ --appkit-color-primary-50: #eef0ff;
746
+ --appkit-color-primary-100: #e0e4ff;
747
+ --appkit-color-primary-200: #c7cdff;
748
+ --appkit-color-primary-300: #a5aeff;
749
+ --appkit-color-primary-400: #7c8cff;
750
+ --appkit-color-primary-500: #5a68e8;
751
+ --appkit-color-primary-600: #4b5bd6;
752
+ --appkit-color-primary-700: #3b45ad;
753
+ --appkit-color-primary-800: #2f3789;
754
+ --appkit-color-primary-900: #262c6d;
755
+ --appkit-color-primary-950: #151840;
756
+
757
+ --appkit-color-secondary: #0f8f5f;
758
+ --appkit-color-secondary-50: #ecfdf5;
759
+ --appkit-color-secondary-100: #d1fae5;
760
+ --appkit-color-secondary-200: #a7f3d0;
761
+ --appkit-color-secondary-300: #6ee7b7;
762
+ --appkit-color-secondary-400: #34b87d;
763
+ --appkit-color-secondary-500: #0f8f5f;
764
+ --appkit-color-secondary-600: #0c744d;
765
+ --appkit-color-secondary-700: #0a5c3d;
766
+ --appkit-color-secondary-800: #084830;
767
+ --appkit-color-secondary-900: #063a27;
768
+ --appkit-color-secondary-950: #032016;
769
+
770
+ --appkit-color-bg: #fbfbfa;
771
+ --appkit-color-surface: #ffffff;
772
+ --appkit-color-surface-elevated: rgba(255, 255, 255, 0.96);
773
+ --appkit-color-surface-input: rgba(244, 244, 242, 0.8);
774
+
775
+ --appkit-color-surface-hover: rgba(22, 24, 29, 0.05);
776
+ --appkit-color-surface-raised: rgba(244, 244, 242, 0.9);
777
+ --appkit-color-primary-surface: rgba(75, 91, 214, 0.1);
778
+
779
+ --appkit-color-border: #e2e2df;
780
+ --appkit-color-border-subtle: rgba(226, 226, 223, 0.7);
781
+
782
+ --appkit-color-text: #16181d;
783
+ --appkit-color-text-muted: #5c6370;
784
+ /* #767d89 measured 4.00:1 — AA for large text only. Darkened to clear AA
785
+ at body size. */
786
+ --appkit-color-text-faint: #6b7280;
787
+ --appkit-color-text-on-primary: #ffffff;
788
+
789
+ --appkit-color-success: #13804f;
790
+ --appkit-color-success-surface: rgba(19, 128, 79, 0.1);
791
+ --appkit-color-warning: #9a6400;
792
+ --appkit-color-warning-surface: rgba(154, 100, 0, 0.1);
793
+ --appkit-color-error: #c62828;
794
+ --appkit-color-error-surface: rgba(198, 40, 40, 0.1);
795
+ --appkit-color-info: #0a69b5;
796
+ --appkit-color-info-surface: rgba(10, 105, 181, 0.1);
797
+
798
+ --appkit-color-focus-ring: #b45a00;
799
+ --appkit-shadow-glow: 0 0 0 1px rgba(75,91,214,0.14), 0 4px 16px -6px rgba(75,91,214,0.18);
800
+ --appkit-shadow-glow-pink: 0 0 0 1px rgba(15,143,95,0.14), 0 4px 18px -6px rgba(15,143,95,0.2);
801
+
802
+ --appkit-font-display: var(--font-mono), "JetBrains Mono", "IBM Plex Mono", ui-monospace, "SFMono-Regular", Consolas, monospace;
803
+ --appkit-font-sans: var(--font-mono), "JetBrains Mono", "IBM Plex Mono", ui-monospace, "SFMono-Regular", Consolas, monospace;
804
+ --appkit-font-editorial: var(--font-body), ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
805
+ --appkit-font-mono: var(--font-mono), "JetBrains Mono", "IBM Plex Mono", ui-monospace, "SFMono-Regular", Consolas, monospace;
806
+ }
807
+
653
808
  /* --- Typography ----------------------------------------------------------- */
654
809
  :root {
655
810
  --appkit-font-sans: var(--font-body), ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
@@ -3481,49 +3636,49 @@
3481
3636
  color: var(--appkit-color-emerald-300);
3482
3637
  }
3483
3638
 
3484
- /**
3485
- * Sign-in gate for money amounts on public listing surfaces.
3486
- *
3487
- * The pending state must occupy the SAME vertical space as a rendered price, or
3488
- * every card in a grid reflows once the session resolves. It is deliberately a
3489
- * silent placeholder rather than a shimmer: the wait is short, and an animated
3490
- * skeleton on 24 cards reads as a page that failed to load.
3491
- */
3492
- .appkit-gated-price__pending {
3493
- display: inline-block;
3494
- min-width: 5rem;
3495
- height: 1.25rem;
3496
- border-radius: 0.25rem;
3497
- /* 🛑 `--appkit-color-surface-muted` is NOT a token — 15 uses, 0 definitions,
3498
- and `audit-undefined-css-vars` ratchets it down. An undefined custom
3499
- property with no fallback makes the whole declaration invalid, so this
3500
- placeholder had no background at all and the grid still reflowed on
3501
- resolve, which is the one job it has. */
3502
- background: var(--appkit-color-surface-input);
3503
- }
3504
-
3505
- .appkit-gated-price__prompt {
3506
- display: inline-flex;
3507
- align-items: center;
3508
- /*
3509
- * The eye is a 2rem IconButton while `__pending` above is a 1.25rem price
3510
- * line, so a GUEST's row grows by 0.75rem once the session resolves. That is
3511
- * deliberate and is the lesser of the two: the alternative is making
3512
- * `__pending` 2rem, which shifts the row for SIGNED-IN users — the ones who
3513
- * end up looking at real content. The guest shift happens once per load and
3514
- * applies to every card identically, so the grid moves as one rather than
3515
- * going ragged.
3516
- */
3517
- line-height: 1.25rem;
3518
- }
3519
-
3520
- /*
3521
- * 🛑 The eye itself has NO rules here, on purpose. It is an `<IconButton
3522
- * size="sm" variant="outline">`, so its box, ink, hover and focus ring all
3523
- * come from the design system — a second, private set of button styles for
3524
- * one control is exactly how a UI ends up with two kinds of icon button that
3525
- * drift apart. This wrapper only has to keep the row's height stable.
3526
- */
3639
+ /**
3640
+ * Sign-in gate for money amounts on public listing surfaces.
3641
+ *
3642
+ * The pending state must occupy the SAME vertical space as a rendered price, or
3643
+ * every card in a grid reflows once the session resolves. It is deliberately a
3644
+ * silent placeholder rather than a shimmer: the wait is short, and an animated
3645
+ * skeleton on 24 cards reads as a page that failed to load.
3646
+ */
3647
+ .appkit-gated-price__pending {
3648
+ display: inline-block;
3649
+ min-width: 5rem;
3650
+ height: 1.25rem;
3651
+ border-radius: 0.25rem;
3652
+ /* 🛑 `--appkit-color-surface-muted` is NOT a token — 15 uses, 0 definitions,
3653
+ and `audit-undefined-css-vars` ratchets it down. An undefined custom
3654
+ property with no fallback makes the whole declaration invalid, so this
3655
+ placeholder had no background at all and the grid still reflowed on
3656
+ resolve, which is the one job it has. */
3657
+ background: var(--appkit-color-surface-input);
3658
+ }
3659
+
3660
+ .appkit-gated-price__prompt {
3661
+ display: inline-flex;
3662
+ align-items: center;
3663
+ /*
3664
+ * The eye is a 2rem IconButton while `__pending` above is a 1.25rem price
3665
+ * line, so a GUEST's row grows by 0.75rem once the session resolves. That is
3666
+ * deliberate and is the lesser of the two: the alternative is making
3667
+ * `__pending` 2rem, which shifts the row for SIGNED-IN users — the ones who
3668
+ * end up looking at real content. The guest shift happens once per load and
3669
+ * applies to every card identically, so the grid moves as one rather than
3670
+ * going ragged.
3671
+ */
3672
+ line-height: 1.25rem;
3673
+ }
3674
+
3675
+ /*
3676
+ * 🛑 The eye itself has NO rules here, on purpose. It is an `<IconButton
3677
+ * size="sm" variant="outline">`, so its box, ink, hover and focus ring all
3678
+ * come from the design system — a second, private set of button styles for
3679
+ * one control is exactly how a UI ends up with two kinds of icon button that
3680
+ * drift apart. This wrapper only has to keep the row's height stable.
3681
+ */
3527
3682
 
3528
3683
  .appkit-item-row {
3529
3684
  display: flex;
@@ -10180,84 +10335,84 @@
10180
10335
  /* Was ORPHANED — @imported from nowhere, so `.appkit-quick-create-modal` (used
10181
10336
  by QuickCreateModal.tsx) shipped to no one. Found by audit-css-shipped.mjs,
10182
10337
  which exists because FormShell.style.css had the same defect. */
10183
- .appkit-quick-create-modal {
10184
- position: fixed;
10185
- inset: 0;
10186
- z-index: var(--appkit-z-modal, 1000);
10187
- display: flex;
10188
- align-items: stretch;
10189
- justify-content: center;
10190
- }
10191
-
10192
- .appkit-quick-create-modal__backdrop {
10193
- position: absolute;
10194
- inset: 0;
10195
- background: rgb(0 0 0 / 0.45);
10196
- }
10197
-
10198
- .appkit-quick-create-modal__panel {
10199
- position: relative;
10200
- display: flex;
10201
- flex-direction: column;
10202
- background: var(--appkit-color-surface, #ffffff);
10203
- color: var(--appkit-color-foreground, inherit);
10204
- width: 100%;
10205
- max-width: 560px;
10206
- margin: auto;
10207
- max-height: 92vh;
10208
- border-radius: 0.75rem;
10209
- box-shadow: var(--appkit-shadow-lg, 0 20px 40px rgb(0 0 0 / 0.25));
10210
- outline: none;
10211
- }
10212
-
10213
- .appkit-quick-create-modal__header {
10214
- display: flex;
10215
- align-items: center;
10216
- justify-content: space-between;
10217
- padding: 1rem 1.25rem;
10218
- border-bottom: 1px solid var(--appkit-color-border, rgb(0 0 0 / 0.1));
10219
- }
10220
-
10221
- .appkit-quick-create-modal__title {
10222
- margin: 0;
10223
- font-size: 1.125rem;
10224
- font-weight: 600;
10225
- }
10226
-
10227
- .appkit-quick-create-modal__body {
10228
- flex: 1 1 auto;
10229
- overflow-y: auto;
10230
- padding: 1.25rem;
10231
- }
10232
-
10233
- /* Chrome only — layout comes from ActionRow. Re-adding `display: flex` or
10234
- `justify-content` here would fight the row this class now decorates. */
10235
- .appkit-quick-create-modal__footer {
10236
- padding: 1rem 1.25rem;
10237
- border-top: 1px solid var(--appkit-color-border, rgb(0 0 0 / 0.1));
10238
- }
10239
-
10240
- .appkit-quick-create-modal__full-link {
10241
- font-size: 0.875rem;
10242
- color: var(--appkit-color-primary, #6366f1);
10243
- text-decoration: underline;
10244
- }
10245
-
10246
- @media (max-width: 640px) {
10247
- .appkit-quick-create-modal {
10248
- align-items: flex-end;
10249
- }
10250
- .appkit-quick-create-modal__panel {
10251
- max-width: 100%;
10252
- margin: 0;
10253
- border-radius: 0.75rem 0.75rem 0 0;
10254
- max-height: 92vh;
10255
- }
10256
- }
10257
-
10258
- [data-theme="default-dark"] .appkit-quick-create-modal__panel {
10259
- background: var(--appkit-color-surface-dark, #1e293b);
10260
- }
10338
+ .appkit-quick-create-modal {
10339
+ position: fixed;
10340
+ inset: 0;
10341
+ z-index: var(--appkit-z-modal, 1000);
10342
+ display: flex;
10343
+ align-items: stretch;
10344
+ justify-content: center;
10345
+ }
10346
+
10347
+ .appkit-quick-create-modal__backdrop {
10348
+ position: absolute;
10349
+ inset: 0;
10350
+ background: rgb(0 0 0 / 0.45);
10351
+ }
10352
+
10353
+ .appkit-quick-create-modal__panel {
10354
+ position: relative;
10355
+ display: flex;
10356
+ flex-direction: column;
10357
+ background: var(--appkit-color-surface, #ffffff);
10358
+ color: var(--appkit-color-foreground, inherit);
10359
+ width: 100%;
10360
+ max-width: 560px;
10361
+ margin: auto;
10362
+ max-height: 92vh;
10363
+ border-radius: 0.75rem;
10364
+ box-shadow: var(--appkit-shadow-lg, 0 20px 40px rgb(0 0 0 / 0.25));
10365
+ outline: none;
10366
+ }
10367
+
10368
+ .appkit-quick-create-modal__header {
10369
+ display: flex;
10370
+ align-items: center;
10371
+ justify-content: space-between;
10372
+ padding: 1rem 1.25rem;
10373
+ border-bottom: 1px solid var(--appkit-color-border, rgb(0 0 0 / 0.1));
10374
+ }
10375
+
10376
+ .appkit-quick-create-modal__title {
10377
+ margin: 0;
10378
+ font-size: 1.125rem;
10379
+ font-weight: 600;
10380
+ }
10381
+
10382
+ .appkit-quick-create-modal__body {
10383
+ flex: 1 1 auto;
10384
+ overflow-y: auto;
10385
+ padding: 1.25rem;
10386
+ }
10387
+
10388
+ /* Chrome only — layout comes from ActionRow. Re-adding `display: flex` or
10389
+ `justify-content` here would fight the row this class now decorates. */
10390
+ .appkit-quick-create-modal__footer {
10391
+ padding: 1rem 1.25rem;
10392
+ border-top: 1px solid var(--appkit-color-border, rgb(0 0 0 / 0.1));
10393
+ }
10394
+
10395
+ .appkit-quick-create-modal__full-link {
10396
+ font-size: 0.875rem;
10397
+ color: var(--appkit-color-primary, #6366f1);
10398
+ text-decoration: underline;
10399
+ }
10400
+
10401
+ @media (max-width: 640px) {
10402
+ .appkit-quick-create-modal {
10403
+ align-items: flex-end;
10404
+ }
10405
+ .appkit-quick-create-modal__panel {
10406
+ max-width: 100%;
10407
+ margin: 0;
10408
+ border-radius: 0.75rem 0.75rem 0 0;
10409
+ max-height: 92vh;
10410
+ }
10411
+ }
10412
+
10413
+ [data-theme="default-dark"] .appkit-quick-create-modal__panel {
10414
+ background: var(--appkit-color-surface-dark, #1e293b);
10415
+ }
10261
10416
 
10262
10417
  /* Last on purpose: hand-mode rules are cross-cutting overrides keyed on
10263
10418
  `[data-hand]`, not a component's own base styles. */
@@ -10321,266 +10476,266 @@
10321
10476
  * bundle-css.mjs flattens only the @import chain rooted here, which is why a
10322
10477
  * stylesheet reachable just from JS never made it in.
10323
10478
  */
10324
- /* ─── FormShell ─────────────────────────────────────────────────────────────── */
10325
-
10326
- .appkit-formshell {
10327
- display: flex;
10328
- flex-direction: column;
10329
- gap: var(--appkit-spacing-6, 1.5rem);
10330
- }
10331
-
10332
- /* Header */
10333
- .appkit-formshell__header {
10334
- display: flex;
10335
- flex-direction: column;
10336
- gap: var(--appkit-spacing-4, 1rem);
10337
- }
10338
-
10339
- .appkit-formshell__title {
10340
- font-size: var(--appkit-font-size-lg, 1.125rem);
10341
- font-weight: 600;
10342
- color: var(--appkit-color-text-primary);
10343
- }
10344
-
10345
- /* ─── Step Indicator ──────────────────────────────────────────────────────── */
10346
-
10347
- .appkit-formshell__step-indicator {
10348
- display: flex;
10349
- flex-wrap: wrap;
10350
- gap: var(--appkit-spacing-1, 0.25rem);
10351
- border-bottom: 1px solid var(--appkit-color-border);
10352
- padding-bottom: var(--appkit-spacing-3, 0.75rem);
10353
- }
10354
-
10355
- .appkit-formshell__step-btn {
10356
- display: flex;
10357
- align-items: center;
10358
- gap: var(--appkit-spacing-2, 0.5rem);
10359
- padding: var(--appkit-spacing-1-5, 0.375rem) var(--appkit-spacing-3, 0.75rem);
10360
- border-radius: var(--appkit-radius-md, 0.375rem);
10361
- background: transparent;
10362
- border: 1px solid transparent;
10363
- color: var(--appkit-color-text-secondary);
10364
- cursor: pointer;
10365
- font-size: var(--appkit-font-size-sm, 0.875rem);
10366
- transition: background 0.15s, border-color 0.15s, color 0.15s;
10367
- }
10368
-
10369
- .appkit-formshell__step-btn:hover {
10370
- background: var(--appkit-color-surface-hover);
10371
- border-color: var(--appkit-color-border);
10372
- }
10373
-
10374
- .appkit-formshell__step-btn--active {
10375
- background: var(--appkit-color-primary-subtle, rgb(from var(--appkit-color-primary) r g b / 0.1));
10376
- border-color: var(--appkit-color-primary);
10377
- color: var(--appkit-color-primary);
10378
- font-weight: 500;
10379
- }
10380
-
10381
- .appkit-formshell__step-btn--error {
10382
- color: var(--appkit-color-error, #dc2626);
10383
- border-color: var(--appkit-color-error, #dc2626);
10384
- }
10385
-
10386
- .appkit-formshell__step-dot {
10387
- position: relative;
10388
- display: flex;
10389
- align-items: center;
10390
- justify-content: center;
10391
- width: 1.5rem;
10392
- height: 1.5rem;
10393
- border-radius: 9999px;
10394
- background: var(--appkit-color-surface-secondary);
10395
- font-size: var(--appkit-font-size-xs, 0.75rem);
10396
- font-weight: 600;
10397
- flex-shrink: 0;
10398
- }
10399
-
10400
- .appkit-formshell__step-btn--active .appkit-formshell__step-dot {
10401
- background: var(--appkit-color-primary);
10402
- color: #fff;
10403
- }
10404
-
10405
- .appkit-formshell__step-btn--error .appkit-formshell__step-dot {
10406
- background: var(--appkit-color-error, #dc2626);
10407
- color: #fff;
10408
- }
10409
-
10410
- /* Red dot badge on step dot */
10411
- .appkit-formshell__step-error-badge {
10412
- position: absolute;
10413
- top: -3px;
10414
- right: -3px;
10415
- width: 8px;
10416
- height: 8px;
10417
- border-radius: 9999px;
10418
- background: var(--appkit-color-error, #dc2626);
10419
- border: 2px solid var(--appkit-color-surface);
10420
- }
10421
-
10422
- /* Inline error count badge (accordion header) */
10423
- .appkit-formshell__step-error-badge--inline {
10424
- position: static;
10425
- width: auto;
10426
- height: auto;
10427
- border-radius: var(--appkit-radius-full, 9999px);
10428
- padding: 0 0.375rem;
10429
- font-size: var(--appkit-font-size-xs, 0.75rem);
10430
- font-weight: 600;
10431
- color: #fff;
10432
- line-height: 1.4;
10433
- border: none;
10434
- }
10435
-
10436
- .appkit-formshell__step-label {
10437
- display: none;
10438
- }
10439
-
10440
- @media (min-width: 640px) {
10441
- .appkit-formshell__step-label {
10442
- display: inline;
10443
- }
10444
- }
10445
-
10446
- /* ─── Error Summary ───────────────────────────────────────────────────────── */
10447
-
10448
- .appkit-formshell__error-summary {
10449
- border: 1px solid var(--appkit-color-error, #dc2626);
10450
- border-radius: var(--appkit-radius-md, 0.375rem);
10451
- padding: var(--appkit-spacing-3, 0.75rem);
10452
- background: rgb(from var(--appkit-color-error, #dc2626) r g b / 0.05);
10453
- }
10454
-
10455
- .appkit-formshell__error-summary__title {
10456
- font-weight: 600;
10457
- margin-bottom: var(--appkit-spacing-2, 0.5rem);
10458
- }
10459
-
10460
- .appkit-formshell__error-summary__list {
10461
- list-style: disc;
10462
- padding-left: 1.25rem;
10463
- display: flex;
10464
- flex-direction: column;
10465
- gap: var(--appkit-spacing-1, 0.25rem);
10466
- }
10467
-
10468
- .appkit-formshell__error-summary__step-link {
10469
- background: none;
10470
- border: none;
10471
- padding: 0;
10472
- margin: 0;
10473
- font: inherit;
10474
- color: inherit;
10475
- text-align: left;
10476
- cursor: pointer;
10477
- text-decoration: underline;
10478
- text-underline-offset: 2px;
10479
- }
10480
-
10481
- .appkit-formshell__error-summary__step-link:hover {
10482
- color: var(--appkit-color-error, #dc2626);
10483
- }
10484
-
10485
- /* ─── Body + Steps ───────────────────────────────────────────────────────── */
10486
-
10487
- .appkit-formshell__body {
10488
- flex: 1;
10489
- /* Ensure body content is not hidden under the sticky footer. The footer is
10490
- ~56px tall; add generous padding so the last field is always reachable. */
10491
- padding-bottom: 5rem;
10492
- }
10493
-
10494
- .appkit-formshell__steps {
10495
- display: flex;
10496
- flex-direction: column;
10497
- gap: var(--appkit-spacing-1, 0.25rem);
10498
- }
10499
-
10500
- .appkit-formshell__step {
10501
- border: 1px solid var(--appkit-color-border);
10502
- border-radius: var(--appkit-radius-md, 0.375rem);
10503
- overflow: hidden;
10504
- }
10505
-
10506
- .appkit-formshell__step--active {
10507
- border-color: var(--appkit-color-primary);
10508
- }
10509
-
10510
- .appkit-formshell__step--error {
10511
- border-color: var(--appkit-color-error, #dc2626);
10512
- }
10513
-
10514
- /* Mobile accordion button — hidden on lg+ (step indicator handles navigation) */
10515
- .appkit-formshell__step-accordion-btn {
10516
- display: flex;
10517
- align-items: center;
10518
- justify-content: space-between;
10519
- width: 100%;
10520
- padding: var(--appkit-spacing-3, 0.75rem) var(--appkit-spacing-4, 1rem);
10521
- background: var(--appkit-color-surface-secondary);
10522
- border: none;
10523
- cursor: pointer;
10524
- font-size: var(--appkit-font-size-sm, 0.875rem);
10525
- font-weight: 500;
10526
- color: var(--appkit-color-text-primary);
10527
- text-align: left;
10528
- }
10529
-
10530
- .appkit-formshell__step-accordion-label {
10531
- flex: 1;
10532
- }
10533
-
10534
- /* On lg+ the accordion controls are purely decorative; the step indicator drives navigation */
10535
- @media (min-width: 1024px) {
10536
- .appkit-formshell--accordion-mobile .appkit-formshell__step-accordion-btn {
10537
- display: none;
10538
- }
10539
-
10540
- .appkit-formshell--accordion-mobile .appkit-formshell__step [hidden] {
10541
- display: block !important;
10542
- }
10543
-
10544
- .appkit-formshell--accordion-mobile .appkit-formshell__step-content {
10545
- display: block !important;
10546
- }
10547
- }
10548
-
10549
- .appkit-formshell__step-content {
10550
- padding: 0.75rem 1.25rem;
10551
- }
10552
-
10553
- @media (max-width: 639px) {
10554
- .appkit-formshell__step-content {
10555
- padding: 0.5rem 0.875rem;
10556
- }
10557
- }
10558
- /* --- Footer --------------------------------------------------------------- */
10559
-
10560
- /*
10561
- * `.appkit-formshell__footer`, `__step-nav` and `__actions` were deleted here:
10562
- * `ui/forms/FormShell.tsx` is context/state only and renders no footer JSX, so
10563
- * nothing had referenced them for a long time. The real form footer lives in
10564
- * `features/shell/FormShell.tsx` and is an ActionRow now.
10565
- *
10566
- * Worth recording: this dead block held the ONLY `flex-wrap: wrap` on any
10567
- * action row in the codebase. Every live footer had lost it.
10568
- */
10569
-
10570
- /* ─── Dark mode ──────────────────────────────────────────────────────────── */
10571
-
10572
- .dark .appkit-formshell__title {
10573
- color: var(--appkit-color-text-primary-dark, inherit);
10574
- }
10575
-
10576
- .dark .appkit-formshell__step-accordion-btn {
10577
- background: var(--appkit-color-surface-secondary-dark, var(--appkit-color-surface-secondary));
10578
- color: var(--appkit-color-text-primary-dark, inherit);
10579
- }
10580
-
10581
- .dark .appkit-formshell__error-summary {
10582
- background: rgb(from var(--appkit-color-error, #dc2626) r g b / 0.1);
10583
- }
10479
+ /* ─── FormShell ─────────────────────────────────────────────────────────────── */
10480
+
10481
+ .appkit-formshell {
10482
+ display: flex;
10483
+ flex-direction: column;
10484
+ gap: var(--appkit-spacing-6, 1.5rem);
10485
+ }
10486
+
10487
+ /* Header */
10488
+ .appkit-formshell__header {
10489
+ display: flex;
10490
+ flex-direction: column;
10491
+ gap: var(--appkit-spacing-4, 1rem);
10492
+ }
10493
+
10494
+ .appkit-formshell__title {
10495
+ font-size: var(--appkit-font-size-lg, 1.125rem);
10496
+ font-weight: 600;
10497
+ color: var(--appkit-color-text-primary);
10498
+ }
10499
+
10500
+ /* ─── Step Indicator ──────────────────────────────────────────────────────── */
10501
+
10502
+ .appkit-formshell__step-indicator {
10503
+ display: flex;
10504
+ flex-wrap: wrap;
10505
+ gap: var(--appkit-spacing-1, 0.25rem);
10506
+ border-bottom: 1px solid var(--appkit-color-border);
10507
+ padding-bottom: var(--appkit-spacing-3, 0.75rem);
10508
+ }
10509
+
10510
+ .appkit-formshell__step-btn {
10511
+ display: flex;
10512
+ align-items: center;
10513
+ gap: var(--appkit-spacing-2, 0.5rem);
10514
+ padding: var(--appkit-spacing-1-5, 0.375rem) var(--appkit-spacing-3, 0.75rem);
10515
+ border-radius: var(--appkit-radius-md, 0.375rem);
10516
+ background: transparent;
10517
+ border: 1px solid transparent;
10518
+ color: var(--appkit-color-text-secondary);
10519
+ cursor: pointer;
10520
+ font-size: var(--appkit-font-size-sm, 0.875rem);
10521
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
10522
+ }
10523
+
10524
+ .appkit-formshell__step-btn:hover {
10525
+ background: var(--appkit-color-surface-hover);
10526
+ border-color: var(--appkit-color-border);
10527
+ }
10528
+
10529
+ .appkit-formshell__step-btn--active {
10530
+ background: var(--appkit-color-primary-subtle, rgb(from var(--appkit-color-primary) r g b / 0.1));
10531
+ border-color: var(--appkit-color-primary);
10532
+ color: var(--appkit-color-primary);
10533
+ font-weight: 500;
10534
+ }
10535
+
10536
+ .appkit-formshell__step-btn--error {
10537
+ color: var(--appkit-color-error, #dc2626);
10538
+ border-color: var(--appkit-color-error, #dc2626);
10539
+ }
10540
+
10541
+ .appkit-formshell__step-dot {
10542
+ position: relative;
10543
+ display: flex;
10544
+ align-items: center;
10545
+ justify-content: center;
10546
+ width: 1.5rem;
10547
+ height: 1.5rem;
10548
+ border-radius: 9999px;
10549
+ background: var(--appkit-color-surface-secondary);
10550
+ font-size: var(--appkit-font-size-xs, 0.75rem);
10551
+ font-weight: 600;
10552
+ flex-shrink: 0;
10553
+ }
10554
+
10555
+ .appkit-formshell__step-btn--active .appkit-formshell__step-dot {
10556
+ background: var(--appkit-color-primary);
10557
+ color: #fff;
10558
+ }
10559
+
10560
+ .appkit-formshell__step-btn--error .appkit-formshell__step-dot {
10561
+ background: var(--appkit-color-error, #dc2626);
10562
+ color: #fff;
10563
+ }
10564
+
10565
+ /* Red dot badge on step dot */
10566
+ .appkit-formshell__step-error-badge {
10567
+ position: absolute;
10568
+ top: -3px;
10569
+ right: -3px;
10570
+ width: 8px;
10571
+ height: 8px;
10572
+ border-radius: 9999px;
10573
+ background: var(--appkit-color-error, #dc2626);
10574
+ border: 2px solid var(--appkit-color-surface);
10575
+ }
10576
+
10577
+ /* Inline error count badge (accordion header) */
10578
+ .appkit-formshell__step-error-badge--inline {
10579
+ position: static;
10580
+ width: auto;
10581
+ height: auto;
10582
+ border-radius: var(--appkit-radius-full, 9999px);
10583
+ padding: 0 0.375rem;
10584
+ font-size: var(--appkit-font-size-xs, 0.75rem);
10585
+ font-weight: 600;
10586
+ color: #fff;
10587
+ line-height: 1.4;
10588
+ border: none;
10589
+ }
10590
+
10591
+ .appkit-formshell__step-label {
10592
+ display: none;
10593
+ }
10594
+
10595
+ @media (min-width: 640px) {
10596
+ .appkit-formshell__step-label {
10597
+ display: inline;
10598
+ }
10599
+ }
10600
+
10601
+ /* ─── Error Summary ───────────────────────────────────────────────────────── */
10602
+
10603
+ .appkit-formshell__error-summary {
10604
+ border: 1px solid var(--appkit-color-error, #dc2626);
10605
+ border-radius: var(--appkit-radius-md, 0.375rem);
10606
+ padding: var(--appkit-spacing-3, 0.75rem);
10607
+ background: rgb(from var(--appkit-color-error, #dc2626) r g b / 0.05);
10608
+ }
10609
+
10610
+ .appkit-formshell__error-summary__title {
10611
+ font-weight: 600;
10612
+ margin-bottom: var(--appkit-spacing-2, 0.5rem);
10613
+ }
10614
+
10615
+ .appkit-formshell__error-summary__list {
10616
+ list-style: disc;
10617
+ padding-left: 1.25rem;
10618
+ display: flex;
10619
+ flex-direction: column;
10620
+ gap: var(--appkit-spacing-1, 0.25rem);
10621
+ }
10622
+
10623
+ .appkit-formshell__error-summary__step-link {
10624
+ background: none;
10625
+ border: none;
10626
+ padding: 0;
10627
+ margin: 0;
10628
+ font: inherit;
10629
+ color: inherit;
10630
+ text-align: left;
10631
+ cursor: pointer;
10632
+ text-decoration: underline;
10633
+ text-underline-offset: 2px;
10634
+ }
10635
+
10636
+ .appkit-formshell__error-summary__step-link:hover {
10637
+ color: var(--appkit-color-error, #dc2626);
10638
+ }
10639
+
10640
+ /* ─── Body + Steps ───────────────────────────────────────────────────────── */
10641
+
10642
+ .appkit-formshell__body {
10643
+ flex: 1;
10644
+ /* Ensure body content is not hidden under the sticky footer. The footer is
10645
+ ~56px tall; add generous padding so the last field is always reachable. */
10646
+ padding-bottom: 5rem;
10647
+ }
10648
+
10649
+ .appkit-formshell__steps {
10650
+ display: flex;
10651
+ flex-direction: column;
10652
+ gap: var(--appkit-spacing-1, 0.25rem);
10653
+ }
10654
+
10655
+ .appkit-formshell__step {
10656
+ border: 1px solid var(--appkit-color-border);
10657
+ border-radius: var(--appkit-radius-md, 0.375rem);
10658
+ overflow: hidden;
10659
+ }
10660
+
10661
+ .appkit-formshell__step--active {
10662
+ border-color: var(--appkit-color-primary);
10663
+ }
10664
+
10665
+ .appkit-formshell__step--error {
10666
+ border-color: var(--appkit-color-error, #dc2626);
10667
+ }
10668
+
10669
+ /* Mobile accordion button — hidden on lg+ (step indicator handles navigation) */
10670
+ .appkit-formshell__step-accordion-btn {
10671
+ display: flex;
10672
+ align-items: center;
10673
+ justify-content: space-between;
10674
+ width: 100%;
10675
+ padding: var(--appkit-spacing-3, 0.75rem) var(--appkit-spacing-4, 1rem);
10676
+ background: var(--appkit-color-surface-secondary);
10677
+ border: none;
10678
+ cursor: pointer;
10679
+ font-size: var(--appkit-font-size-sm, 0.875rem);
10680
+ font-weight: 500;
10681
+ color: var(--appkit-color-text-primary);
10682
+ text-align: left;
10683
+ }
10684
+
10685
+ .appkit-formshell__step-accordion-label {
10686
+ flex: 1;
10687
+ }
10688
+
10689
+ /* On lg+ the accordion controls are purely decorative; the step indicator drives navigation */
10690
+ @media (min-width: 1024px) {
10691
+ .appkit-formshell--accordion-mobile .appkit-formshell__step-accordion-btn {
10692
+ display: none;
10693
+ }
10694
+
10695
+ .appkit-formshell--accordion-mobile .appkit-formshell__step [hidden] {
10696
+ display: block !important;
10697
+ }
10698
+
10699
+ .appkit-formshell--accordion-mobile .appkit-formshell__step-content {
10700
+ display: block !important;
10701
+ }
10702
+ }
10703
+
10704
+ .appkit-formshell__step-content {
10705
+ padding: 0.75rem 1.25rem;
10706
+ }
10707
+
10708
+ @media (max-width: 639px) {
10709
+ .appkit-formshell__step-content {
10710
+ padding: 0.5rem 0.875rem;
10711
+ }
10712
+ }
10713
+ /* --- Footer --------------------------------------------------------------- */
10714
+
10715
+ /*
10716
+ * `.appkit-formshell__footer`, `__step-nav` and `__actions` were deleted here:
10717
+ * `ui/forms/FormShell.tsx` is context/state only and renders no footer JSX, so
10718
+ * nothing had referenced them for a long time. The real form footer lives in
10719
+ * `features/shell/FormShell.tsx` and is an ActionRow now.
10720
+ *
10721
+ * Worth recording: this dead block held the ONLY `flex-wrap: wrap` on any
10722
+ * action row in the codebase. Every live footer had lost it.
10723
+ */
10724
+
10725
+ /* ─── Dark mode ──────────────────────────────────────────────────────────── */
10726
+
10727
+ .dark .appkit-formshell__title {
10728
+ color: var(--appkit-color-text-primary-dark, inherit);
10729
+ }
10730
+
10731
+ .dark .appkit-formshell__step-accordion-btn {
10732
+ background: var(--appkit-color-surface-secondary-dark, var(--appkit-color-surface-secondary));
10733
+ color: var(--appkit-color-text-primary-dark, inherit);
10734
+ }
10735
+
10736
+ .dark .appkit-formshell__error-summary {
10737
+ background: rgb(from var(--appkit-color-error, #dc2626) r g b / 0.1);
10738
+ }
10584
10739
 
10585
10740
  /*
10586
10741
  * Third-party stylesheet, vendored into dist/vendor by copy-assets.mjs.