@techsio/ui-kit 0.54.0 → 0.54.1

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.
Files changed (68) hide show
  1. package/dist/atoms/button.js +3 -2
  2. package/dist/atoms/checkbox.js +1 -1
  3. package/dist/atoms/input.js +6 -2
  4. package/dist/atoms/numeric-input.js +5 -5
  5. package/dist/atoms/skeleton.js +1 -1
  6. package/dist/atoms/textarea.js +6 -2
  7. package/dist/internal/organisms/sidebar.styles.js +1 -1
  8. package/dist/molecules/accordion.js +2 -3
  9. package/dist/molecules/cascade-select.js +2 -2
  10. package/dist/molecules/color-select.js +2 -2
  11. package/dist/molecules/combobox.js +2 -2
  12. package/dist/molecules/date-picker.js +7 -7
  13. package/dist/molecules/dialog.js +3 -3
  14. package/dist/molecules/file-upload.js +1 -1
  15. package/dist/molecules/form-checkbox.js +2 -2
  16. package/dist/molecules/phone-input.js +3 -3
  17. package/dist/molecules/popover.js +2 -2
  18. package/dist/molecules/radio-card.js +7 -7
  19. package/dist/molecules/select.js +2 -2
  20. package/dist/molecules/slider.js +1 -1
  21. package/dist/molecules/steps.js +2 -2
  22. package/dist/molecules/toast.js +1 -1
  23. package/dist/molecules/tour.js +1 -1
  24. package/dist/molecules/tree-view.js +1 -1
  25. package/dist/organisms/data-table.js +1 -1
  26. package/dist/organisms/gallery.js +2 -2
  27. package/dist/organisms/table.js +2 -2
  28. package/dist/src/atoms/button.d.ts +1 -1
  29. package/dist/src/atoms/button.d.ts.map +1 -1
  30. package/dist/src/atoms/checkbox.d.ts +1 -1
  31. package/dist/src/atoms/input.d.ts +1 -1
  32. package/dist/src/atoms/input.d.ts.map +1 -1
  33. package/dist/src/atoms/numeric-input.d.ts +1 -1
  34. package/dist/src/atoms/skeleton.d.ts +1 -1
  35. package/dist/src/atoms/textarea.d.ts +1 -1
  36. package/dist/src/atoms/textarea.d.ts.map +1 -1
  37. package/dist/src/molecules/accordion.d.ts.map +1 -1
  38. package/dist/src/molecules/cascade-select.d.ts +1 -1
  39. package/dist/src/molecules/combobox.d.ts +1 -1
  40. package/dist/src/molecules/date-picker.d.ts +1 -1
  41. package/dist/src/molecules/file-upload.d.ts +1 -1
  42. package/dist/src/molecules/phone-input.d.ts +1 -1
  43. package/dist/src/molecules/popover.d.ts +1 -1
  44. package/dist/src/molecules/radio-card.d.ts +1 -1
  45. package/dist/src/molecules/tour.d.ts +1 -1
  46. package/dist/src/organisms/gallery.d.ts +1 -1
  47. package/dist/src/organisms/table.d.ts +1 -1
  48. package/dist/src/templates/accordion.d.ts +1 -1
  49. package/dist/src/templates/gallery.d.ts +1 -1
  50. package/dist/src/templates/numeric-input.d.ts +1 -1
  51. package/dist/src/templates/popover.d.ts +1 -1
  52. package/dist/src/templates/select.d.ts +1 -1
  53. package/dist/stories/changelog/changelog.stories.d.ts.map +1 -1
  54. package/dist/stories/templates/akros-product-card.stories.d.ts +96 -0
  55. package/dist/stories/templates/akros-product-card.stories.d.ts.map +1 -0
  56. package/package.json +1 -1
  57. package/src/tokens/_base.css +14 -7
  58. package/src/tokens/_reset.css +66 -0
  59. package/src/tokens/_semantic.css +33 -43
  60. package/src/tokens/_tokens-base.css +3 -0
  61. package/src/tokens/components/_popup-surface.css +13 -3
  62. package/src/tokens/components/atoms/_badge.css +1 -1
  63. package/src/tokens/components/molecules/_drawer.css +5 -5
  64. package/src/tokens/components/molecules/_vertical-navigation.css +1 -1
  65. package/src/tokens/components/organisms/_data-table.css +1 -1
  66. package/src/tokens/figma/brand-overrides.css +15 -15
  67. package/src/tokens/figma/variables.css +11 -11
  68. package/src/tokens/theme.css +1 -1
@@ -2,7 +2,7 @@
2
2
  * Combobox — @techsio/ui-kit molecule.
3
3
  *
4
4
  * @component Combobox
5
- * @componentVersion v1.3.0
5
+ * @componentVersion v1.3.1
6
6
  * @skill combobox-usage
7
7
  * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
8
  *
@@ -2,7 +2,7 @@
2
2
  * DatePicker — @techsio/ui-kit molecule.
3
3
  *
4
4
  * @component DatePicker
5
- * @componentVersion v1.1.1
5
+ * @componentVersion v1.1.2
6
6
  * @skill date-picker-usage
7
7
  * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
8
  */
@@ -2,7 +2,7 @@
2
2
  * FileUpload — @techsio/ui-kit molecule.
3
3
  *
4
4
  * @component FileUpload
5
- * @componentVersion v1.0.0
5
+ * @componentVersion v1.0.1
6
6
  * @skill file-upload-usage
7
7
  * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
8
  *
@@ -2,7 +2,7 @@
2
2
  * PhoneInput — @techsio/ui-kit molecule.
3
3
  *
4
4
  * @component PhoneInput
5
- * @componentVersion v1.0.0
5
+ * @componentVersion v1.0.1
6
6
  * @skill phone-input-usage
7
7
  * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
8
  *
@@ -2,7 +2,7 @@
2
2
  * Popover — @techsio/ui-kit molecule.
3
3
  *
4
4
  * @component Popover
5
- * @componentVersion v1.0.0
5
+ * @componentVersion v1.0.1
6
6
  * @skill popover-usage
7
7
  * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
8
  *
@@ -2,7 +2,7 @@
2
2
  * RadioCard — @techsio/ui-kit molecule.
3
3
  *
4
4
  * @component RadioCard
5
- * @componentVersion v1.0.0
5
+ * @componentVersion v1.0.1
6
6
  * @skill radio-card-usage
7
7
  * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
8
  *
@@ -2,7 +2,7 @@
2
2
  * Tour — @techsio/ui-kit molecule.
3
3
  *
4
4
  * @component Tour
5
- * @componentVersion v1.0.2
5
+ * @componentVersion v1.0.3
6
6
  * @skill tour-usage
7
7
  * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
8
  */
@@ -2,7 +2,7 @@
2
2
  * Gallery — @techsio/ui-kit organism.
3
3
  *
4
4
  * @component Gallery
5
- * @componentVersion v1.0.0
5
+ * @componentVersion v1.0.1
6
6
  * @skill gallery-usage
7
7
  * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
8
  *
@@ -2,7 +2,7 @@
2
2
  * Table — @techsio/ui-kit organism.
3
3
  *
4
4
  * @component Table
5
- * @componentVersion v1.2.0
5
+ * @componentVersion v1.2.1
6
6
  * @skill table-usage
7
7
  * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
8
  *
@@ -2,7 +2,7 @@
2
2
  * Accordion — @techsio/ui-kit template.
3
3
  *
4
4
  * @component Accordion
5
- * @componentVersion v1.0.0
5
+ * @componentVersion v1.0.1
6
6
  * @skill accordion-usage
7
7
  * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
8
  *
@@ -2,7 +2,7 @@
2
2
  * Gallery — @techsio/ui-kit template.
3
3
  *
4
4
  * @component Gallery
5
- * @componentVersion v1.0.0
5
+ * @componentVersion v1.0.1
6
6
  * @skill gallery-usage
7
7
  * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
8
  *
@@ -2,7 +2,7 @@
2
2
  * NumericInput — @techsio/ui-kit template.
3
3
  *
4
4
  * @component NumericInput
5
- * @componentVersion v1.1.0
5
+ * @componentVersion v1.1.1
6
6
  * @skill numeric-input-usage
7
7
  * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
8
  *
@@ -2,7 +2,7 @@
2
2
  * Popover — @techsio/ui-kit template.
3
3
  *
4
4
  * @component Popover
5
- * @componentVersion v1.0.0
5
+ * @componentVersion v1.0.1
6
6
  * @skill popover-usage
7
7
  * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
8
  *
@@ -2,7 +2,7 @@
2
2
  * Select — @techsio/ui-kit template.
3
3
  *
4
4
  * @component Select
5
- * @componentVersion v1.1.0
5
+ * @componentVersion v1.1.1
6
6
  * @skill select-usage
7
7
  * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
8
  *
@@ -1 +1 @@
1
- {"version":3,"file":"changelog.stories.d.ts","sourceRoot":"","sources":["../../../stories/changelog/changelog.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AA4StD,iBAAS,SAAS,4CAUjB;AAED,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,SAAS,CAKhC,CAAA;AAED,eAAe,IAAI,CAAA;AAEnB,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,OAAO,SAAS,CAAM,CAAA"}
1
+ {"version":3,"file":"changelog.stories.d.ts","sourceRoot":"","sources":["../../../stories/changelog/changelog.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AA0XtD,iBAAS,SAAS,4CAUjB;AAED,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,SAAS,CAKhC,CAAA;AAED,eAAe,IAAI,CAAA;AAEnB,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,OAAO,SAAS,CAAM,CAAA"}
@@ -0,0 +1,96 @@
1
+ import type { StoryObj } from "@storybook/react";
2
+ import { type ReactNode } from "react";
3
+ import { type AvailabilityStatusProps } from "../../src/molecules/availability-status.js";
4
+ import { type PriceBlockProps } from "../../src/molecules/price-block.js";
5
+ import "./akros-product-card.css";
6
+ type AkrosCardExampleProps = {
7
+ name: string;
8
+ description: string;
9
+ price: PriceBlockProps;
10
+ availability: AvailabilityStatusProps;
11
+ badgeLabel?: string;
12
+ imageAvailable: boolean;
13
+ action: "add" | "pending" | "disabled" | "detail" | "variants";
14
+ actionContent?: ReactNode;
15
+ onAddToCart: (quantity?: string) => void;
16
+ };
17
+ declare function AkrosCardExample({ name, description, price, availability, badgeLabel, imageAvailable, action, actionContent, onAddToCart, }: AkrosCardExampleProps): import("react/jsx-runtime").JSX.Element;
18
+ declare const meta: {
19
+ title: string;
20
+ component: typeof AkrosCardExample;
21
+ tags: string[];
22
+ globals: {
23
+ brand: string;
24
+ mode: string;
25
+ };
26
+ parameters: {
27
+ layout: string;
28
+ docs: {
29
+ description: {
30
+ component: string;
31
+ };
32
+ };
33
+ };
34
+ argTypes: {
35
+ name: {
36
+ control: "text";
37
+ };
38
+ description: {
39
+ control: "text";
40
+ };
41
+ price: {
42
+ control: "object";
43
+ description: string;
44
+ };
45
+ availability: {
46
+ control: "object";
47
+ description: string;
48
+ };
49
+ badgeLabel: {
50
+ control: "text";
51
+ };
52
+ imageAvailable: {
53
+ control: "boolean";
54
+ };
55
+ action: {
56
+ control: "select";
57
+ options: string[];
58
+ };
59
+ onAddToCart: {
60
+ control: false;
61
+ };
62
+ actionContent: {
63
+ control: false;
64
+ table: {
65
+ disable: true;
66
+ };
67
+ };
68
+ };
69
+ args: {
70
+ name: string;
71
+ description: string;
72
+ price: {
73
+ state: "known";
74
+ amountLabel: string;
75
+ taxLabel: string;
76
+ unitLabel: string;
77
+ };
78
+ availability: {
79
+ status: "available";
80
+ label: string;
81
+ };
82
+ imageAvailable: true;
83
+ action: "add";
84
+ onAddToCart: import("storybook/test").Mock<(...args: any[]) => any>;
85
+ };
86
+ };
87
+ export default meta;
88
+ type Story = StoryObj<AkrosCardExampleProps>;
89
+ export declare const Playground: Story;
90
+ export declare const States: Story;
91
+ export declare const PriceStates: Story;
92
+ export declare const AvailabilityStates: Story;
93
+ export declare const LongContent: Story;
94
+ export declare const ResponsiveCatalog: Story;
95
+ export declare const WithQuantityField: Story;
96
+ //# sourceMappingURL=akros-product-card.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"akros-product-card.stories.d.ts","sourceRoot":"","sources":["../../../stories/templates/akros-product-card.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAA;AAQhD,OAAO,EAEN,KAAK,uBAAuB,EAC5B,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAEN,KAAK,eAAe,EACpB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,0BAA0B,CAAA;AAMjC,KAAK,qBAAqB,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,eAAe,CAAA;IACtB,YAAY,EAAE,uBAAuB,CAAA;IACrC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAA;IAC9D,aAAa,CAAC,EAAE,SAAS,CAAA;IACzB,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACxC,CAAA;AAED,iBAAS,gBAAgB,CAAC,EACzB,IAAI,EACJ,WAAW,EACX,KAAK,EACL,YAAY,EACZ,UAAU,EACV,cAAc,EACd,MAAM,EACN,aAAa,EACb,WAAW,GACX,EAAE,qBAAqB,2CA6FvB;AAED,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiD+B,CAAA;AAEzC,eAAe,IAAI,CAAA;AACnB,KAAK,KAAK,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAA;AAE5C,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,KAiEpB,CAAA;AAoDD,eAAO,MAAM,WAAW,EAAE,KAiBzB,CAAA;AAsDD,eAAO,MAAM,kBAAkB,EAAE,KAoBhC,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,KAsBzB,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,KA6B/B,CAAA;AAqDD,eAAO,MAAM,iBAAiB,EAAE,KAY/B,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@techsio/ui-kit",
3
- "version": "0.54.0",
3
+ "version": "0.54.1",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "repository": {
@@ -5,9 +5,9 @@
5
5
  --radius-lg: 12px;
6
6
  --radius-full: 9999px;
7
7
 
8
- --color-shadow-1: light-dark(rgba(0, 0, 0, 0.16), rgba(0, 0, 0, 1));
9
- --color-shadow-2: light-dark(rgba(0, 0, 0, 0.06), rgba(0, 0, 0, 1));
10
- --color-shadow-3: light-dark(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 1));
8
+ --color-shadow-1: light-dark(oklch(0% 0 none / 0.16), oklch(0% 0 none));
9
+ --color-shadow-2: light-dark(oklch(0% 0 none / 0.06), oklch(0% 0 none));
10
+ --color-shadow-3: light-dark(oklch(0% 0 none / 0.1), oklch(0% 0 none));
11
11
 
12
12
  --offset-shadow-1: 0px 1px 3px 0px;
13
13
  --offset-shadow-2: 0px 5px 6px 0px;
@@ -17,9 +17,16 @@
17
17
  var(--offset-shadow-1) var(--color-shadow-1), var(--offset-shadow-2)
18
18
  var(--color-shadow-2), var(--offset-shadow-3) var(--color-shadow-3);
19
19
 
20
+ /* Motion — strong ease-out for UI feedback, ease-in-out for on-screen
21
+ * movement. Never ease-in: it delays the response the user is waiting for. */
22
+ --ease-out: cubic-bezier(0.23, 1, 0.32, 1);
23
+ --ease-in-out: cubic-bezier(0.77, 0, 0.175, 1);
24
+ --default-transition-timing-function: var(--ease-out);
25
+
20
26
  /* Shadows */
21
- --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
22
- --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
23
- --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
24
- --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.15), 0 10px 10px rgba(0, 0, 0, 0.04);
27
+ --shadow-sm: 0 1px 2px oklch(0% 0 none / 0.05);
28
+ --shadow-md: 0 4px 6px oklch(0% 0 none / 0.1);
29
+ --shadow-lg: 0 10px 15px oklch(0% 0 none / 0.1);
30
+ --shadow-xl:
31
+ 0 20px 25px oklch(0% 0 none / 0.15), 0 10px 10px oklch(0% 0 none / 0.04);
25
32
  }
@@ -0,0 +1,66 @@
1
+ /*
2
+ * Element defaults and interaction variants shared by every component.
3
+ * Based on the good-css.com reset, adopted rule by rule.
4
+ */
5
+
6
+ /*
7
+ * Tailwind's built-in hover: only checks (hover: hover). Hybrid and touch
8
+ * devices still report it, so a tapped control keeps its hover colour until
9
+ * the next tap elsewhere. Requiring a fine pointer limits hover to mice and
10
+ * trackpads.
11
+ */
12
+ @custom-variant hover {
13
+ @media (hover: hover) and (pointer: fine) {
14
+ &:hover {
15
+ @slot;
16
+ }
17
+ }
18
+ }
19
+
20
+ @layer base {
21
+ :root {
22
+ /* Lets height/width transition to and from `auto` (accordions, disclosures). */
23
+ interpolate-size: allow-keywords;
24
+ /* Reserve the scrollbar track so locking scroll for a dialog does not shift
25
+ * the page. Zag's scroll lock detects this and skips its padding fallback. */
26
+ scrollbar-gutter: stable;
27
+ /* Avoid single-word last lines in body copy. */
28
+ text-wrap: pretty;
29
+ -webkit-text-size-adjust: none;
30
+ text-size-adjust: none;
31
+ /* Components draw their own :active state. */
32
+ -webkit-tap-highlight-color: transparent;
33
+ }
34
+
35
+ :where(h1, h2, h3, h4, h5, h6) {
36
+ text-wrap: balance;
37
+ }
38
+
39
+ /* Removes the double-tap-to-zoom delay on controls. */
40
+ :where(
41
+ a,
42
+ button,
43
+ label,
44
+ select,
45
+ summary,
46
+ [role="button"],
47
+ [role="option"],
48
+ [role="tab"],
49
+ input:is([type="checkbox"], [type="radio"])
50
+ ) {
51
+ touch-action: manipulation;
52
+ }
53
+ }
54
+
55
+ /*
56
+ * iOS Safari zooms the page into any focused field whose text is under 16px.
57
+ * The fluid --text-sm step drops below that on phones, so small fields floor
58
+ * at 16px. Unlayered so it wins over the Figma @theme values.
59
+ */
60
+ :root {
61
+ --text-input-sm: max(16px, var(--text-sm));
62
+ --text-textarea-sm: max(16px, var(--text-sm));
63
+ --text-numeric-input-sm: max(16px, var(--text-sm));
64
+ --text-combobox-sm: max(16px, var(--text-sm));
65
+ --text-phone-input-sm: max(16px, var(--text-sm));
66
+ }
@@ -5,86 +5,76 @@
5
5
  * - --alpha(var(--color) / 50%): Adjusts transparency of a color. Tailwind's v4 utility
6
6
  * that compiles to color-mix() for better browser support.
7
7
  */
8
+
9
+ /*
10
+ * Theme-direction switch: 1 on light surfaces, -1 on dark ones. Every
11
+ * lightness offset below is written once and flips with it, so a dark
12
+ * surface lightens on hover where a light one darkens.
13
+ */
8
14
  :root {
9
- --state-hover: -0.08;
10
- --state-active: -0.12;
15
+ --theme-sign: 1;
11
16
  --state-disabled-chroma: 0.01;
12
17
  --state-light-variant: 0.1; /* Always make colors lighter for -light variant */
13
18
  --state-light-chroma: 0.6; /* Reduce saturation for softer, pastel colors */
14
- --state-secondary-text: 0.15;
15
19
  --state-border: 15%;
16
- --state-placeholder: 0.25;
17
20
  --max-lightness: 0.97;
18
21
  --opacity-disabled: 60%;
19
22
  --opacity-placeholder: 60%;
20
23
  --opacity-text-secondary: 70%;
21
24
  --opacity-disabled-placeholder: 30%;
22
25
  --fill-increment: 5%;
23
- --surface-increment: 0.05;
24
- --state-fg-lightness: 0.42; /* Accent color lightness for text - WCAG AAA on light bg */
26
+ }
27
+
28
+ /*
29
+ * Custom properties resolve where they are declared, so the derived offsets
30
+ * are re-declared on every element that can change --theme-sign.
31
+ */
32
+ :where(:root, .light, .always-light, .dark, .always-dark, .reverse) {
33
+ --state-hover: calc(-0.08 * var(--theme-sign));
34
+ --state-active: calc(-0.12 * var(--theme-sign));
35
+ --state-secondary-text: calc(0.15 * var(--theme-sign));
36
+ --state-placeholder: calc(0.25 * var(--theme-sign));
37
+ --surface-increment: calc(0.05 * var(--theme-sign));
38
+ /* Accent text lightness: 0.42 on light (WCAG AAA), 0.85 on dark. */
39
+ --state-fg-lightness: calc(0.635 - 0.215 * var(--theme-sign));
40
+ }
41
+
42
+ /* Explicit Light class(es) — re-asserts light inside a nested .dark/.always-dark subtree */
43
+ :is(.light, .always-light) {
44
+ --theme-sign: 1;
25
45
  }
26
46
 
27
47
  /* Explicit Dark class(es) */
28
48
  :is(.dark, .always-dark) {
29
- --state-hover: 0.08;
30
- --state-active: 0.12;
31
- --state-secondary-text: -0.15;
32
- --state-placeholder: -0.25;
33
- --surface-increment: -0.05;
34
- --state-fg-lightness: 0.85;
49
+ --theme-sign: -1;
35
50
  }
36
51
 
37
52
  /* System Dark preference (when no explicit class forces light) */
38
53
  @media (prefers-color-scheme: dark) {
39
54
  :root:not(.light):not(.always-light) {
40
- --state-hover: 0.08;
41
- --state-active: 0.12;
42
- --state-secondary-text: -0.15;
43
- --state-placeholder: -0.25;
44
- --surface-increment: -0.05;
45
- --state-fg-lightness: 0.85;
55
+ --theme-sign: -1;
46
56
  }
47
57
  }
48
58
 
49
- /* Reverse if parents has .always-light/dark and we want to make reverse style to parent */
59
+ /* Reverse flips whatever its parent theme is. */
50
60
  :is(.light, .always-light) .reverse {
51
- --state-hover: 0.08;
52
- --state-active: 0.12;
53
- --state-secondary-text: -0.15;
54
- --state-placeholder: -0.25;
55
- --surface-increment: -0.05;
56
- --state-fg-lightness: 0.85;
61
+ --theme-sign: -1;
57
62
  }
58
63
 
59
64
  :is(.dark, .always-dark) .reverse {
60
- --state-hover: -0.08;
61
- --state-active: -0.12;
62
- --state-secondary-text: 0.15;
63
- --state-placeholder: 0.25;
64
- --surface-increment: 0.05;
65
- --state-fg-lightness: 0.42;
65
+ --theme-sign: 1;
66
66
  }
67
67
 
68
68
  /* Reverse on System Light/Dark preference (when no explicit theme class is present) */
69
69
  @media (prefers-color-scheme: light) {
70
70
  .reverse:not(.dark):not(.always-dark):not(.light):not(.always-light) {
71
- --state-hover: 0.08;
72
- --state-active: 0.12;
73
- --state-secondary-text: -0.15;
74
- --state-placeholder: -0.25;
75
- --surface-increment: -0.05;
76
- --state-fg-lightness: 0.85;
71
+ --theme-sign: -1;
77
72
  }
78
73
  }
79
74
 
80
75
  @media (prefers-color-scheme: dark) {
81
76
  .reverse:not(.dark):not(.always-dark):not(.light):not(.always-light) {
82
- --state-hover: -0.08;
83
- --state-active: -0.12;
84
- --state-secondary-text: 0.15;
85
- --state-placeholder: 0.25;
86
- --surface-increment: 0.05;
87
- --state-fg-lightness: 0.42;
77
+ --theme-sign: 1;
88
78
  }
89
79
  }
90
80
 
@@ -26,6 +26,9 @@
26
26
  * (e.g. neo) emit tokens here; base is the default @theme above. */
27
27
  @import "./figma/brand-overrides.css";
28
28
 
29
+ /* Element defaults, the hover variant and the mobile input-size floor. */
30
+ @import "./_reset.css";
31
+
29
32
  /* Base styles */
30
33
  :root {
31
34
  color-scheme: light dark;
@@ -79,8 +79,9 @@
79
79
  z-index: calc(var(--z-popup) + var(--layer-index, 0));
80
80
 
81
81
  /* The panel takes DOM focus for keyboard navigation, but that focus is
82
- * never the thing the user should see — the highlighted option is. */
83
- outline: none;
82
+ * never the thing the user should see — the highlighted option is.
83
+ * Transparent rather than none, so forced-colors mode still draws it. */
84
+ outline: 2px solid transparent;
84
85
 
85
86
  /* Scale from the trigger, whichever side the panel flipped to. */
86
87
  transform-origin: var(--transform-origin);
@@ -159,5 +160,14 @@
159
160
 
160
161
  /* Highlight is the focus affordance; a second ring on top of it reads as
161
162
  * two selected rows. */
162
- outline: none;
163
+ outline-style: none;
164
+
165
+ /* Forced-colors mode drops the highlight background, so the active option
166
+ * would be invisible. Draw it as an outline instead. */
167
+ @media (forced-colors: active) {
168
+ &[data-highlighted] {
169
+ outline: 2px solid Highlight;
170
+ outline-offset: -2px;
171
+ }
172
+ }
163
173
  }
@@ -11,5 +11,5 @@
11
11
  */
12
12
 
13
13
  @theme static {
14
- --color-badge-border: oklch(0 0 0 / 0);
14
+ --color-badge-border: oklch(0 0 none / 0);
15
15
  }
@@ -163,7 +163,7 @@
163
163
  var(--duration-drawer-backdrop-exit) *
164
164
  var(--drawer-swipe-strength, 1)
165
165
  )
166
- ease-in both;
166
+ var(--ease-in-out) both;
167
167
  }
168
168
 
169
169
  &[data-swiping] {
@@ -200,25 +200,25 @@
200
200
  &[data-state="closed"][data-swipe-direction="left"] {
201
201
  animation: drawer-exit-left
202
202
  calc(var(--duration-drawer-exit) * var(--drawer-swipe-strength, 1))
203
- ease-in both;
203
+ var(--ease-in-out) both;
204
204
  }
205
205
 
206
206
  &[data-state="closed"][data-swipe-direction="right"] {
207
207
  animation: drawer-exit-right
208
208
  calc(var(--duration-drawer-exit) * var(--drawer-swipe-strength, 1))
209
- ease-in both;
209
+ var(--ease-in-out) both;
210
210
  }
211
211
 
212
212
  &[data-state="closed"][data-swipe-direction="up"] {
213
213
  animation: drawer-exit-up
214
214
  calc(var(--duration-drawer-exit) * var(--drawer-swipe-strength, 1))
215
- ease-in both;
215
+ var(--ease-in-out) both;
216
216
  }
217
217
 
218
218
  &[data-state="closed"][data-swipe-direction="down"] {
219
219
  animation: drawer-exit-down
220
220
  calc(var(--duration-drawer-exit) * var(--drawer-swipe-strength, 1))
221
- ease-in both;
221
+ var(--ease-in-out) both;
222
222
  }
223
223
 
224
224
  @starting-style {
@@ -126,7 +126,7 @@
126
126
  flex-shrink: 0;
127
127
  }
128
128
 
129
- @media (hover: hover) {
129
+ @media (hover: hover) and (pointer: fine) {
130
130
  &:hover:not(:has(> [data-part="link"][data-current])):has(
131
131
  > [data-part="link"]:not([data-disabled]),
132
132
  > [data-part="branch-trigger"]:not(:disabled)
@@ -55,7 +55,7 @@
55
55
  *
56
56
  * `background: inherit` gives the second without the first: every row-level
57
57
  * tint in this system is an alpha overlay meant to composite over a surface
58
- * (`--color-table-row-striped-secondary` is literally `oklch(0 0 0 / 0)`), so
58
+ * (`--color-table-row-striped-secondary` is literally `oklch(0 0 none / 0)`), so
59
59
  * inheriting it yields a see-through cell.
60
60
  *
61
61
  * Compositing solves both at once — the same trick `OPAQUE_HEADER_BG` uses for
@@ -138,9 +138,9 @@
138
138
  --color-fg-status-warning: var(--color-warning-500);
139
139
  --color-fill-active: var(--color-black-15);
140
140
  --color-fill-base: var(--color-black-5);
141
- --color-fill-borderless-active: oklch(0 0 0 / 0);
142
- --color-fill-borderless-base: oklch(0 0 0 / 0);
143
- --color-fill-borderless-hover: oklch(0 0 0 / 0);
141
+ --color-fill-borderless-active: oklch(0 0 none / 0);
142
+ --color-fill-borderless-base: oklch(0 0 none / 0);
143
+ --color-fill-borderless-hover: oklch(0 0 none / 0);
144
144
  --color-fill-highlight: var(--color-neutral-300);
145
145
  --color-fill-hover: var(--color-primary-200);
146
146
  --color-fill-overlay: var(--color-neutral-200);
@@ -167,7 +167,7 @@
167
167
  --color-secondary-800: oklch(0.381 0.06 182.018);
168
168
  --color-secondary-900: oklch(0.327 0.051 180.942);
169
169
  --color-success: var(--color-success-500);
170
- --default-ring-color: oklch(0 0 0);
170
+ --default-ring-color: oklch(0 0 none);
171
171
  }
172
172
 
173
173
  [data-theme="akros"] {
@@ -220,8 +220,8 @@
220
220
  --color-bg-transparent: var(--color-transparent);
221
221
  --color-bg-warning-active: var(--color-warning-700);
222
222
  --color-bg-warning-hover: var(--color-warning-600);
223
- --color-black-15: oklch(0 0 0 / 0.15);
224
- --color-black-5: oklch(0 0 0 / 0.05);
223
+ --color-black-15: oklch(0 0 none / 0.15);
224
+ --color-black-5: oklch(0 0 none / 0.05);
225
225
  --color-blue-500: var(--color-tertiary-600);
226
226
  --color-border-danger-focus: var(--color-danger-500);
227
227
  --color-border-danger-hover: var(--color-danger-600);
@@ -275,15 +275,15 @@
275
275
  --color-gray-950: var(--color-black);
276
276
  --color-link: var(--color-black);
277
277
  --color-neutral-100: oklch(0.964 0.002 247.84);
278
- --color-neutral-200: oklch(0.937 0 0);
279
- --color-neutral-300: oklch(0.848 0 0);
280
- --color-neutral-400: oklch(0.683 0 0);
281
- --color-neutral-50: oklch(0.982 0 0);
282
- --color-neutral-500: oklch(0.51 0 0);
283
- --color-neutral-600: oklch(0.446 0 0);
284
- --color-neutral-700: oklch(0.321 0 0);
285
- --color-neutral-800: oklch(0.252 0 0);
286
- --color-neutral-900: oklch(0.178 0 0);
278
+ --color-neutral-200: oklch(0.937 0 none);
279
+ --color-neutral-300: oklch(0.848 0 none);
280
+ --color-neutral-400: oklch(0.683 0 none);
281
+ --color-neutral-50: oklch(0.982 0 none);
282
+ --color-neutral-500: oklch(0.51 0 none);
283
+ --color-neutral-600: oklch(0.446 0 none);
284
+ --color-neutral-700: oklch(0.321 0 none);
285
+ --color-neutral-800: oklch(0.252 0 none);
286
+ --color-neutral-900: oklch(0.178 0 none);
287
287
  --color-neutral-950: var(--color-black);
288
288
  --color-primary: var(--color-primary-500);
289
289
  --color-primary-100: oklch(0.957 0.055 90.321);