@exsto/ds 0.0.1-rc.5 → 0.0.1-rc.6

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
@@ -3,6 +3,9 @@
3
3
  @supports (((-webkit-hyphens: none)) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color: rgb(from red r g b)))) {
4
4
  :root, :host {
5
5
  --shimmer-angle: 20deg;
6
+ --scroll-bar-size: 8px;
7
+ --scroll-bar-gap: 0px;
8
+ --scroll-bar-start: 0px;
6
9
  }
7
10
 
8
11
  *, :before, :after, ::backdrop {
@@ -758,14 +761,26 @@
758
761
  margin-block: auto;
759
762
  }
760
763
 
764
+ .ms-\(--scroll-bar-gap\) {
765
+ margin-inline-start: var(--scroll-bar-gap);
766
+ }
767
+
761
768
  .ms-auto {
762
769
  margin-inline-start: auto;
763
770
  }
764
771
 
772
+ .me-\(--scroll-bar-gap\) {
773
+ margin-inline-end: var(--scroll-bar-gap);
774
+ }
775
+
765
776
  .-mt-4 {
766
777
  margin-top: calc(var(--spacing) * -4);
767
778
  }
768
779
 
780
+ .mt-\(--scroll-bar-offset-top\) {
781
+ margin-top: var(--scroll-bar-offset-top);
782
+ }
783
+
769
784
  .mt-0\.5 {
770
785
  margin-top: calc(var(--spacing) * .5);
771
786
  }
@@ -786,6 +801,10 @@
786
801
  margin-bottom: calc(var(--spacing) * -4);
787
802
  }
788
803
 
804
+ .mb-\(--scroll-bar-gap\) {
805
+ margin-bottom: var(--scroll-bar-gap);
806
+ }
807
+
789
808
  .mb-2 {
790
809
  margin-bottom: calc(var(--spacing) * 2);
791
810
  }
@@ -975,10 +994,22 @@
975
994
  height: var(--positioner-height);
976
995
  }
977
996
 
997
+ .h-\(--scroll-bar-length\) {
998
+ height: var(--scroll-bar-length);
999
+ }
1000
+
1001
+ .h-\(--scroll-bar-size\) {
1002
+ height: var(--scroll-bar-size);
1003
+ }
1004
+
978
1005
  .h-0\.5 {
979
1006
  height: calc(var(--spacing) * .5);
980
1007
  }
981
1008
 
1009
+ .h-1 {
1010
+ height: var(--spacing);
1011
+ }
1012
+
982
1013
  .h-1\.5 {
983
1014
  height: calc(var(--spacing) * 1.5);
984
1015
  }
@@ -1123,6 +1154,10 @@
1123
1154
  width: var(--positioner-width);
1124
1155
  }
1125
1156
 
1157
+ .w-\(--scroll-bar-size\) {
1158
+ width: var(--scroll-bar-size);
1159
+ }
1160
+
1126
1161
  .w-\(--sidebar-width\) {
1127
1162
  width: var(--sidebar-width);
1128
1163
  }
@@ -1498,6 +1533,10 @@
1498
1533
  touch-action: none;
1499
1534
  }
1500
1535
 
1536
+ .resize {
1537
+ resize: both;
1538
+ }
1539
+
1501
1540
  .resize-none {
1502
1541
  resize: none;
1503
1542
  }
@@ -1942,16 +1981,6 @@
1942
1981
  }
1943
1982
  }
1944
1983
 
1945
- .bg-destructive\/20 {
1946
- background-color: var(--destructive);
1947
- }
1948
-
1949
- @supports (color: color-mix(in lab, red, red)) {
1950
- .bg-destructive\/20 {
1951
- background-color: color-mix(in oklab, var(--destructive) 20%, transparent);
1952
- }
1953
- }
1954
-
1955
1984
  .bg-foreground {
1956
1985
  background-color: var(--foreground);
1957
1986
  }
@@ -1970,16 +1999,6 @@
1970
1999
  }
1971
2000
  }
1972
2001
 
1973
- .bg-info\/20 {
1974
- background-color: var(--info);
1975
- }
1976
-
1977
- @supports (color: color-mix(in lab, red, red)) {
1978
- .bg-info\/20 {
1979
- background-color: color-mix(in oklab, var(--info) 20%, transparent);
1980
- }
1981
- }
1982
-
1983
2002
  .bg-input\/30 {
1984
2003
  background-color: var(--input);
1985
2004
  }
@@ -2030,16 +2049,6 @@
2030
2049
  background-color: var(--primary-foreground);
2031
2050
  }
2032
2051
 
2033
- .bg-primary\/20 {
2034
- background-color: var(--primary);
2035
- }
2036
-
2037
- @supports (color: color-mix(in lab, red, red)) {
2038
- .bg-primary\/20 {
2039
- background-color: color-mix(in oklab, var(--primary) 20%, transparent);
2040
- }
2041
- }
2042
-
2043
2052
  .bg-secondary {
2044
2053
  background-color: var(--secondary);
2045
2054
  }
@@ -2052,10 +2061,6 @@
2052
2061
  background-color: var(--sidebar-border);
2053
2062
  }
2054
2063
 
2055
- .bg-success {
2056
- background-color: var(--success);
2057
- }
2058
-
2059
2064
  .bg-success-ring\/40 {
2060
2065
  background-color: var(--success-ring);
2061
2066
  }
@@ -2066,24 +2071,10 @@
2066
2071
  }
2067
2072
  }
2068
2073
 
2069
- .bg-success\/20 {
2070
- background-color: var(--success);
2071
- }
2072
-
2073
- @supports (color: color-mix(in lab, red, red)) {
2074
- .bg-success\/20 {
2075
- background-color: color-mix(in oklab, var(--success) 20%, transparent);
2076
- }
2077
- }
2078
-
2079
2074
  .bg-transparent {
2080
2075
  background-color: #0000;
2081
2076
  }
2082
2077
 
2083
- .bg-warning {
2084
- background-color: var(--warning);
2085
- }
2086
-
2087
2078
  .bg-warning-ring\/40 {
2088
2079
  background-color: var(--warning-ring);
2089
2080
  }
@@ -2094,16 +2085,6 @@
2094
2085
  }
2095
2086
  }
2096
2087
 
2097
- .bg-warning\/20 {
2098
- background-color: var(--warning);
2099
- }
2100
-
2101
- @supports (color: color-mix(in lab, red, red)) {
2102
- .bg-warning\/20 {
2103
- background-color: color-mix(in oklab, var(--warning) 20%, transparent);
2104
- }
2105
- }
2106
-
2107
2088
  .bg-gradient-to-t {
2108
2089
  --tw-gradient-position: to top in oklab;
2109
2090
  background-image: linear-gradient(var(--tw-gradient-stops));
@@ -7294,6 +7275,29 @@
7294
7275
  }
7295
7276
  }
7296
7277
 
7278
+ @property --scroll-bar-size {
7279
+ syntax: "<length>";
7280
+ inherits: true;
7281
+ initial-value: 8px;
7282
+ }
7283
+
7284
+ @property --scroll-bar-gap {
7285
+ syntax: "<length>";
7286
+ inherits: true;
7287
+ initial-value: 0;
7288
+ }
7289
+
7290
+ @property --scroll-bar-start {
7291
+ syntax: "<length>";
7292
+ inherits: true;
7293
+ initial-value: 0;
7294
+ }
7295
+
7296
+ [data-slot="scroll-area-scrollbar"] {
7297
+ --scroll-bar-offset-top: calc(var(--scroll-bar-gap) + var(--scroll-bar-start));
7298
+ --scroll-bar-length: calc(100% - var(--scroll-bar-gap) * 2 - var(--scroll-bar-start));
7299
+ }
7300
+
7297
7301
  :where(:root) {
7298
7302
  --focus-ring: var(--ring);
7299
7303
  }
@@ -7330,6 +7334,9 @@
7330
7334
  --motion-fade-in: .16s;
7331
7335
  --motion-fade-delay: 40ms;
7332
7336
  --motion-fade-out: .12s;
7337
+ }
7338
+
7339
+ :where(:root) {
7333
7340
  --ease-expand: var(--ease-out, cubic-bezier(0, 0, .2, 1));
7334
7341
  }
7335
7342
 
@@ -7379,6 +7386,10 @@
7379
7386
  transition-duration: var(--motion-expand);
7380
7387
  }
7381
7388
 
7389
+ [data-slot="progress"][aria-hidden="true"] > span[role="presentation"] {
7390
+ display: none;
7391
+ }
7392
+
7382
7393
  @property --tw-translate-x {
7383
7394
  syntax: "*";
7384
7395
  inherits: false;
@@ -10,6 +10,12 @@ export interface IDateRangePickerProps {
10
10
  value: TDateRange;
11
11
  onValueChange: (value: TDateRange) => void;
12
12
  placeholder?: string;
13
+ /**
14
+ * What the trigger says once a range is set. `range` (default) writes the ends; `label` keeps the label, so a
15
+ * range the page shows elsewhere (as a removable chip, say) is not repeated here. In both, the trigger carries
16
+ * `data-set` while either end is set, for a look of its own.
17
+ */
18
+ summary?: 'range' | 'label';
13
19
  /** How the ends are written on the trigger (BCP 47); en-GB reads 05 Mar 2026. */
14
20
  locale?: string;
15
21
  /** An accessible name for the trigger, when there is no visible label to point at. */
@@ -17,4 +23,4 @@ export interface IDateRangePickerProps {
17
23
  className?: string;
18
24
  }
19
25
  /** A range of calendar days, either end optional; two months side by side, one on a phone. */
20
- export declare const DateRangePicker: ({ id, value, onValueChange, placeholder, locale, "aria-label": ariaLabel, className, }: IDateRangePickerProps) => import('react').JSX.Element;
26
+ export declare const DateRangePicker: ({ id, value, onValueChange, placeholder, locale, summary, "aria-label": ariaLabel, className, }: IDateRangePickerProps) => import('react').JSX.Element;
@@ -30,6 +30,12 @@ export interface IMultiSelectProps {
30
30
  options: readonly TMultiSelectOption[];
31
31
  value: readonly string[];
32
32
  onValueChange: (value: string[]) => void;
33
+ /**
34
+ * What the trigger says once something is chosen. `selection` (default) names the one chosen or counts several;
35
+ * `label` keeps the label and only counts, so a value the page shows elsewhere (as a removable chip, say) is
36
+ * not repeated here: nothing chosen reads `placeholder`, anything chosen reads `labels.selectedCount(n)`.
37
+ */
38
+ summary?: 'selection' | 'label';
33
39
  /** For a Label's htmlFor. */
34
40
  id?: string;
35
41
  'aria-label'?: string;
@@ -73,7 +79,9 @@ export interface IMultiSelectProps {
73
79
  */
74
80
  export declare const resolveChosen: (value: readonly string[], options: readonly TMultiSelectOption[], selectedOptions?: readonly TMultiSelectOption[]) => TMultiSelectOption[];
75
81
  /** What the trigger says: the placeholder, the one picked, or a count. */
76
- export declare const summarize: (chosen: readonly TMultiSelectOption[], placeholder: string, labels: IMultiSelectLabels) => string;
82
+ export declare const summarize: (chosen: readonly TMultiSelectOption[], placeholder: string, labels: IMultiSelectLabels, summary?: "selection" | "label") => string;
83
+ /** Every chosen name, for a tooltip on a trigger whose text is cut. With `label` the names are not shown, so it is the text itself. */
84
+ export declare const fullSelection: (chosen: readonly TMultiSelectOption[], placeholder: string, labels: IMultiSelectLabels, summary?: "selection" | "label") => string;
77
85
  /**
78
86
  * A choice of several from a list: a trigger shaped like a Select that says what is picked
79
87
  * (the placeholder, the one picked, or a count), and a popup with a search field and checkbox
@@ -85,4 +93,4 @@ export declare const summarize: (chosen: readonly TMultiSelectOption[], placehol
85
93
  * server: the caller fetches the options for the typed text, and says when they are loading,
86
94
  * failed, or have another page.
87
95
  */
88
- export declare const MultiSelect: ({ placeholder, searchPlaceholder, options, value, onValueChange, id, disabled, className, onSearchChange, searchDelay, selectedOptions, loading, error, onRetry, hasMore, onLoadMore, loadingMore, labels: labelOverrides, ...rest }: IMultiSelectProps) => import('react').JSX.Element;
96
+ export declare const MultiSelect: ({ placeholder, searchPlaceholder, options, value, onValueChange, id, disabled, className, onSearchChange, searchDelay, selectedOptions, loading, error, onRetry, hasMore, onLoadMore, loadingMore, labels: labelOverrides, summary, ...rest }: IMultiSelectProps) => import('react').JSX.Element;
@@ -1,13 +1,47 @@
1
1
  import { Progress as ProgressPrimitive } from '@base-ui/react/progress';
2
2
  import { VariantProps } from 'class-variance-authority';
3
- declare const progressIndicatorVariants: (props?: ({
4
- tone?: "default" | "destructive" | "success" | "warning" | "info" | null | undefined;
3
+ /**
4
+ * The tones: a closed set of semantic colours rather than a class string, so a bar cannot carry a
5
+ * colour the theme does not define and dark mode and a re-theme keep working. Each is the theme token
6
+ * the fill uses; the track is a 20% tint of the same token.
7
+ */
8
+ declare const TONE_TOKEN: {
9
+ readonly default: "var(--primary)";
10
+ readonly info: "var(--info)";
11
+ readonly success: "var(--success)";
12
+ readonly warning: "var(--warning)";
13
+ readonly destructive: "var(--destructive)";
14
+ };
15
+ export type TProgressTone = keyof typeof TONE_TOKEN;
16
+ /**
17
+ * Colours an app can set without a class string. --progress-color replaces the fill (any colour, such as an
18
+ * app's own status tokens); --progress-track replaces the track, which does not follow the fill: an app
19
+ * that wants a neutral track sets it to var(--muted). Both are read where the bar is, so they follow the
20
+ * theme and can be set on :root or on any ancestor.
21
+ */
22
+ export declare const progressFill: (tone: TProgressTone) => string;
23
+ export declare const progressTrack: (tone: TProgressTone) => string;
24
+ /**
25
+ * How the fill eases its width. The defaults are the 300ms ease-in-out it always had; an app retunes them
26
+ * with --progress-duration and --progress-ease, or turns the easing off with `animated={false}` when the
27
+ * number it shows is itself animated and the bar is driven from the same clock.
28
+ */
29
+ export declare const PROGRESS_DURATION = "var(--progress-duration, 300ms)";
30
+ export declare const PROGRESS_EASE = "var(--progress-ease, cubic-bezier(0.4, 0, 0.2, 1))";
31
+ declare const progressTrackVariants: (props?: ({
32
+ size?: "default" | "sm" | null | undefined;
5
33
  } & import('class-variance-authority/types').ClassProp) | undefined) => string;
6
- export type TProgressTone = NonNullable<VariantProps<typeof progressIndicatorVariants>['tone']>;
7
34
  export interface IProgressProps extends Omit<ProgressPrimitive.Root.Props, 'value'> {
8
35
  value?: number | null;
9
36
  /** The bar's colour: a share of a total reads as `warning` when nearly used up, `success` when done. */
10
37
  tone?: TProgressTone;
38
+ /** 4px (`sm`) or 8px (default) tall. */
39
+ size?: VariantProps<typeof progressTrackVariants>['size'];
40
+ /**
41
+ * Whether the fill eases when `value` changes. Turn it off when the value already moves smoothly
42
+ * (driven from an animated number's clock), or the bar eases a second time behind it.
43
+ */
44
+ animated?: boolean;
11
45
  }
12
- export declare const Progress: ({ value, tone, className, ...props }: IProgressProps) => import('react').JSX.Element;
46
+ export declare const Progress: ({ value, tone, size, animated, className, ...props }: IProgressProps) => import('react').JSX.Element;
13
47
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exsto/ds",
3
- "version": "0.0.1-rc.5",
3
+ "version": "0.0.1-rc.6",
4
4
  "description": "The eDynamix design system: React components and design tokens.",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [