@tenphi/tasty 0.0.0-snapshot.1afab2a → 0.0.0-snapshot.1c5dff6

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.
@@ -6,15 +6,10 @@ interface ScrollbarStyleProps {
6
6
  overflow?: string;
7
7
  }
8
8
  /**
9
- * Standards-first scrollbar styling.
9
+ * Standards-based scrollbar styling using `scrollbar-width`, `scrollbar-color`,
10
+ * and `scrollbar-gutter`.
10
11
  *
11
- * Uses `scrollbar-width`, `scrollbar-color`, and `scrollbar-gutter` as the
12
- * primary approach. Adds `::-webkit-scrollbar-*` pseudo-elements only when
13
- * the `styled` modifier or a custom size value is specified — for features
14
- * the standard API cannot express (border-radius, transitions, explicit
15
- * dimensions).
16
- *
17
- * Returns CSSMap[] where pseudo-element rules use $ for sub-selectors.
12
+ * Returns CSSMap[] where each entry maps to CSS declarations on the element.
18
13
  */
19
14
  declare function scrollbarStyle({
20
15
  scrollbar,
@@ -3,15 +3,10 @@ import { parseStyle } from "../utils/styles.js";
3
3
 
4
4
  //#region src/styles/scrollbar.ts
5
5
  /**
6
- * Standards-first scrollbar styling.
6
+ * Standards-based scrollbar styling using `scrollbar-width`, `scrollbar-color`,
7
+ * and `scrollbar-gutter`.
7
8
  *
8
- * Uses `scrollbar-width`, `scrollbar-color`, and `scrollbar-gutter` as the
9
- * primary approach. Adds `::-webkit-scrollbar-*` pseudo-elements only when
10
- * the `styled` modifier or a custom size value is specified — for features
11
- * the standard API cannot express (border-radius, transitions, explicit
12
- * dimensions).
13
- *
14
- * Returns CSSMap[] where pseudo-element rules use $ for sub-selectors.
9
+ * Returns CSSMap[] where each entry maps to CSS declarations on the element.
15
10
  */
16
11
  function scrollbarStyle({ scrollbar, overflow }) {
17
12
  if (!scrollbar && scrollbar !== 0) return;
@@ -19,84 +14,18 @@ function scrollbarStyle({ scrollbar, overflow }) {
19
14
  const { mods, colors, values } = parseStyle(String(value)).groups[0] ?? makeEmptyDetails();
20
15
  const defaultThumbColor = "var(--scrollbar-thumb-color)";
21
16
  const defaultTrackColor = "var(--scrollbar-track-color, transparent)";
22
- if (mods.includes("none")) return [{ "scrollbar-width": "none" }, {
23
- $: "::-webkit-scrollbar",
24
- width: "0px",
25
- height: "0px",
26
- display: "none"
27
- }];
17
+ if (mods.includes("none")) return [{ "scrollbar-width": "none" }];
28
18
  const root = {};
29
19
  const isAuto = values.includes("auto");
30
20
  if (mods.includes("thin")) root["scrollbar-width"] = "thin";
31
21
  else if (isAuto) root["scrollbar-width"] = "auto";
32
- const thumbColor = colors?.[0] || defaultThumbColor;
33
- const trackColor = colors?.[1] || defaultTrackColor;
34
- root["scrollbar-color"] = `${thumbColor} ${trackColor}`;
22
+ root["scrollbar-color"] = `${colors?.[0] || defaultThumbColor} ${colors?.[1] || defaultTrackColor}`;
35
23
  if (mods.includes("stable") || mods.includes("both-edges")) root["scrollbar-gutter"] = mods.includes("both-edges") ? "stable both-edges" : "stable";
36
24
  if (mods.includes("always")) {
37
25
  root["overflow"] = overflow || "auto";
38
26
  if (!root["scrollbar-gutter"]) root["scrollbar-gutter"] = "stable";
39
27
  }
40
- const sizeValues = values.filter((v) => v !== "auto");
41
- const hasCustomSize = sizeValues.length > 0;
42
- const isStyled = mods.includes("styled");
43
- const needsWebkit = isStyled || hasCustomSize;
44
- if (needsWebkit && !root["scrollbar-width"]) root["scrollbar-width"] = "thin";
45
- const result = [root];
46
- if (needsWebkit) {
47
- const sizeValue = sizeValues[0] || "8px";
48
- const cornerColor = colors?.[2] || trackColor;
49
- const webkitScrollbar = {
50
- width: sizeValue,
51
- height: sizeValue
52
- };
53
- const webkitTrack = {};
54
- const webkitThumb = {};
55
- const webkitCorner = {};
56
- if (colors?.length) {
57
- webkitScrollbar["background"] = trackColor;
58
- webkitTrack["background"] = trackColor;
59
- webkitThumb["background"] = thumbColor;
60
- webkitCorner["background"] = cornerColor;
61
- }
62
- if (isStyled) {
63
- const baseTransition = [
64
- "background var(--transition)",
65
- "border-radius var(--transition)",
66
- "box-shadow var(--transition)",
67
- "width var(--transition)",
68
- "height var(--transition)",
69
- "border var(--transition)"
70
- ].join(", ");
71
- webkitScrollbar["transition"] = baseTransition;
72
- if (!webkitScrollbar["background"]) webkitScrollbar["background"] = defaultTrackColor;
73
- if (!webkitThumb["background"]) webkitThumb["background"] = defaultThumbColor;
74
- webkitThumb["border-radius"] = "8px";
75
- webkitThumb["min-height"] = "24px";
76
- webkitThumb["transition"] = baseTransition;
77
- if (!webkitTrack["background"]) webkitTrack["background"] = defaultTrackColor;
78
- webkitTrack["transition"] = baseTransition;
79
- if (!webkitCorner["background"]) webkitCorner["background"] = defaultTrackColor;
80
- webkitCorner["transition"] = baseTransition;
81
- }
82
- result.push({
83
- $: "::-webkit-scrollbar",
84
- ...webkitScrollbar
85
- });
86
- if (Object.keys(webkitTrack).length) result.push({
87
- $: "::-webkit-scrollbar-track",
88
- ...webkitTrack
89
- });
90
- if (Object.keys(webkitThumb).length) result.push({
91
- $: "::-webkit-scrollbar-thumb",
92
- ...webkitThumb
93
- });
94
- if (Object.keys(webkitCorner).length) result.push({
95
- $: "::-webkit-scrollbar-corner",
96
- ...webkitCorner
97
- });
98
- }
99
- return result;
28
+ return [root];
100
29
  }
101
30
  scrollbarStyle.__lookupStyles = ["scrollbar", "overflow"];
102
31
 
@@ -1 +1 @@
1
- {"version":3,"file":"scrollbar.js","names":[],"sources":["../../src/styles/scrollbar.ts"],"sourcesContent":["import { makeEmptyDetails } from '../parser/types';\nimport type { CSSMap } from '../utils/styles';\nimport { parseStyle } from '../utils/styles';\n\ninterface ScrollbarStyleProps {\n scrollbar?: string | boolean | number;\n overflow?: string;\n}\n\n/**\n * Standards-first scrollbar styling.\n *\n * Uses `scrollbar-width`, `scrollbar-color`, and `scrollbar-gutter` as the\n * primary approach. Adds `::-webkit-scrollbar-*` pseudo-elements only when\n * the `styled` modifier or a custom size value is specified — for features\n * the standard API cannot express (border-radius, transitions, explicit\n * dimensions).\n *\n * Returns CSSMap[] where pseudo-element rules use $ for sub-selectors.\n */\nexport function scrollbarStyle({\n scrollbar,\n overflow,\n}: ScrollbarStyleProps): CSSMap[] | undefined {\n if (!scrollbar && scrollbar !== 0) return;\n\n const value = scrollbar === true || scrollbar === '' ? 'thin' : scrollbar;\n const processed = parseStyle(String(value));\n const { mods, colors, values } = processed.groups[0] ?? makeEmptyDetails();\n\n const defaultThumbColor = 'var(--scrollbar-thumb-color)';\n const defaultTrackColor = 'var(--scrollbar-track-color, transparent)';\n\n if (mods.includes('none')) {\n return [\n { 'scrollbar-width': 'none' },\n {\n $: '::-webkit-scrollbar',\n width: '0px',\n height: '0px',\n display: 'none',\n },\n ];\n }\n\n const root: Record<string, string> = {};\n\n const isAuto = values.includes('auto');\n\n if (mods.includes('thin')) {\n root['scrollbar-width'] = 'thin';\n } else if (isAuto) {\n root['scrollbar-width'] = 'auto';\n }\n\n const thumbColor = colors?.[0] || defaultThumbColor;\n const trackColor = colors?.[1] || defaultTrackColor;\n root['scrollbar-color'] = `${thumbColor} ${trackColor}`;\n\n if (mods.includes('stable') || mods.includes('both-edges')) {\n root['scrollbar-gutter'] = mods.includes('both-edges')\n ? 'stable both-edges'\n : 'stable';\n }\n\n if (mods.includes('always')) {\n root['overflow'] = overflow || 'auto';\n\n if (!root['scrollbar-gutter']) {\n root['scrollbar-gutter'] = 'stable';\n }\n }\n\n const sizeValues = values.filter((v) => v !== 'auto');\n const hasCustomSize = sizeValues.length > 0;\n const isStyled = mods.includes('styled');\n const needsWebkit = isStyled || hasCustomSize;\n\n if (needsWebkit && !root['scrollbar-width']) {\n root['scrollbar-width'] = 'thin';\n }\n\n const result: CSSMap[] = [root];\n\n if (needsWebkit) {\n const defaultSize = '8px';\n const sizeValue = sizeValues[0] || defaultSize;\n const cornerColor = colors?.[2] || trackColor;\n\n const webkitScrollbar: Record<string, string> = {\n width: sizeValue,\n height: sizeValue,\n };\n\n const webkitTrack: Record<string, string> = {};\n const webkitThumb: Record<string, string> = {};\n const webkitCorner: Record<string, string> = {};\n\n if (colors?.length) {\n webkitScrollbar['background'] = trackColor;\n webkitTrack['background'] = trackColor;\n webkitThumb['background'] = thumbColor;\n webkitCorner['background'] = cornerColor;\n }\n\n if (isStyled) {\n const baseTransition = [\n 'background var(--transition)',\n 'border-radius var(--transition)',\n 'box-shadow var(--transition)',\n 'width var(--transition)',\n 'height var(--transition)',\n 'border var(--transition)',\n ].join(', ');\n\n webkitScrollbar['transition'] = baseTransition;\n if (!webkitScrollbar['background']) {\n webkitScrollbar['background'] = defaultTrackColor;\n }\n\n if (!webkitThumb['background']) {\n webkitThumb['background'] = defaultThumbColor;\n }\n webkitThumb['border-radius'] = '8px';\n webkitThumb['min-height'] = '24px';\n webkitThumb['transition'] = baseTransition;\n\n if (!webkitTrack['background']) {\n webkitTrack['background'] = defaultTrackColor;\n }\n webkitTrack['transition'] = baseTransition;\n\n if (!webkitCorner['background']) {\n webkitCorner['background'] = defaultTrackColor;\n }\n webkitCorner['transition'] = baseTransition;\n }\n\n result.push({ $: '::-webkit-scrollbar', ...webkitScrollbar });\n\n if (Object.keys(webkitTrack).length) {\n result.push({ $: '::-webkit-scrollbar-track', ...webkitTrack });\n }\n\n if (Object.keys(webkitThumb).length) {\n result.push({ $: '::-webkit-scrollbar-thumb', ...webkitThumb });\n }\n\n if (Object.keys(webkitCorner).length) {\n result.push({ $: '::-webkit-scrollbar-corner', ...webkitCorner });\n }\n }\n\n return result;\n}\n\nscrollbarStyle.__lookupStyles = ['scrollbar', 'overflow'];\n"],"mappings":";;;;;;;;;;;;;;;AAoBA,SAAgB,eAAe,EAC7B,WACA,YAC4C;AAC5C,KAAI,CAAC,aAAa,cAAc,EAAG;CAEnC,MAAM,QAAQ,cAAc,QAAQ,cAAc,KAAK,SAAS;CAEhE,MAAM,EAAE,MAAM,QAAQ,WADJ,WAAW,OAAO,MAAM,CAAC,CACA,OAAO,MAAM,kBAAkB;CAE1E,MAAM,oBAAoB;CAC1B,MAAM,oBAAoB;AAE1B,KAAI,KAAK,SAAS,OAAO,CACvB,QAAO,CACL,EAAE,mBAAmB,QAAQ,EAC7B;EACE,GAAG;EACH,OAAO;EACP,QAAQ;EACR,SAAS;EACV,CACF;CAGH,MAAM,OAA+B,EAAE;CAEvC,MAAM,SAAS,OAAO,SAAS,OAAO;AAEtC,KAAI,KAAK,SAAS,OAAO,CACvB,MAAK,qBAAqB;UACjB,OACT,MAAK,qBAAqB;CAG5B,MAAM,aAAa,SAAS,MAAM;CAClC,MAAM,aAAa,SAAS,MAAM;AAClC,MAAK,qBAAqB,GAAG,WAAW,GAAG;AAE3C,KAAI,KAAK,SAAS,SAAS,IAAI,KAAK,SAAS,aAAa,CACxD,MAAK,sBAAsB,KAAK,SAAS,aAAa,GAClD,sBACA;AAGN,KAAI,KAAK,SAAS,SAAS,EAAE;AAC3B,OAAK,cAAc,YAAY;AAE/B,MAAI,CAAC,KAAK,oBACR,MAAK,sBAAsB;;CAI/B,MAAM,aAAa,OAAO,QAAQ,MAAM,MAAM,OAAO;CACrD,MAAM,gBAAgB,WAAW,SAAS;CAC1C,MAAM,WAAW,KAAK,SAAS,SAAS;CACxC,MAAM,cAAc,YAAY;AAEhC,KAAI,eAAe,CAAC,KAAK,mBACvB,MAAK,qBAAqB;CAG5B,MAAM,SAAmB,CAAC,KAAK;AAE/B,KAAI,aAAa;EAEf,MAAM,YAAY,WAAW,MADT;EAEpB,MAAM,cAAc,SAAS,MAAM;EAEnC,MAAM,kBAA0C;GAC9C,OAAO;GACP,QAAQ;GACT;EAED,MAAM,cAAsC,EAAE;EAC9C,MAAM,cAAsC,EAAE;EAC9C,MAAM,eAAuC,EAAE;AAE/C,MAAI,QAAQ,QAAQ;AAClB,mBAAgB,gBAAgB;AAChC,eAAY,gBAAgB;AAC5B,eAAY,gBAAgB;AAC5B,gBAAa,gBAAgB;;AAG/B,MAAI,UAAU;GACZ,MAAM,iBAAiB;IACrB;IACA;IACA;IACA;IACA;IACA;IACD,CAAC,KAAK,KAAK;AAEZ,mBAAgB,gBAAgB;AAChC,OAAI,CAAC,gBAAgB,cACnB,iBAAgB,gBAAgB;AAGlC,OAAI,CAAC,YAAY,cACf,aAAY,gBAAgB;AAE9B,eAAY,mBAAmB;AAC/B,eAAY,gBAAgB;AAC5B,eAAY,gBAAgB;AAE5B,OAAI,CAAC,YAAY,cACf,aAAY,gBAAgB;AAE9B,eAAY,gBAAgB;AAE5B,OAAI,CAAC,aAAa,cAChB,cAAa,gBAAgB;AAE/B,gBAAa,gBAAgB;;AAG/B,SAAO,KAAK;GAAE,GAAG;GAAuB,GAAG;GAAiB,CAAC;AAE7D,MAAI,OAAO,KAAK,YAAY,CAAC,OAC3B,QAAO,KAAK;GAAE,GAAG;GAA6B,GAAG;GAAa,CAAC;AAGjE,MAAI,OAAO,KAAK,YAAY,CAAC,OAC3B,QAAO,KAAK;GAAE,GAAG;GAA6B,GAAG;GAAa,CAAC;AAGjE,MAAI,OAAO,KAAK,aAAa,CAAC,OAC5B,QAAO,KAAK;GAAE,GAAG;GAA8B,GAAG;GAAc,CAAC;;AAIrE,QAAO;;AAGT,eAAe,iBAAiB,CAAC,aAAa,WAAW"}
1
+ {"version":3,"file":"scrollbar.js","names":[],"sources":["../../src/styles/scrollbar.ts"],"sourcesContent":["import { makeEmptyDetails } from '../parser/types';\nimport type { CSSMap } from '../utils/styles';\nimport { parseStyle } from '../utils/styles';\n\ninterface ScrollbarStyleProps {\n scrollbar?: string | boolean | number;\n overflow?: string;\n}\n\n/**\n * Standards-based scrollbar styling using `scrollbar-width`, `scrollbar-color`,\n * and `scrollbar-gutter`.\n *\n * Returns CSSMap[] where each entry maps to CSS declarations on the element.\n */\nexport function scrollbarStyle({\n scrollbar,\n overflow,\n}: ScrollbarStyleProps): CSSMap[] | undefined {\n if (!scrollbar && scrollbar !== 0) return;\n\n const value = scrollbar === true || scrollbar === '' ? 'thin' : scrollbar;\n const processed = parseStyle(String(value));\n const { mods, colors, values } = processed.groups[0] ?? makeEmptyDetails();\n\n const defaultThumbColor = 'var(--scrollbar-thumb-color)';\n const defaultTrackColor = 'var(--scrollbar-track-color, transparent)';\n\n if (mods.includes('none')) {\n return [{ 'scrollbar-width': 'none' }];\n }\n\n const root: Record<string, string> = {};\n\n const isAuto = values.includes('auto');\n\n if (mods.includes('thin')) {\n root['scrollbar-width'] = 'thin';\n } else if (isAuto) {\n root['scrollbar-width'] = 'auto';\n }\n\n const thumbColor = colors?.[0] || defaultThumbColor;\n const trackColor = colors?.[1] || defaultTrackColor;\n root['scrollbar-color'] = `${thumbColor} ${trackColor}`;\n\n if (mods.includes('stable') || mods.includes('both-edges')) {\n root['scrollbar-gutter'] = mods.includes('both-edges')\n ? 'stable both-edges'\n : 'stable';\n }\n\n if (mods.includes('always')) {\n root['overflow'] = overflow || 'auto';\n\n if (!root['scrollbar-gutter']) {\n root['scrollbar-gutter'] = 'stable';\n }\n }\n\n return [root];\n}\n\nscrollbarStyle.__lookupStyles = ['scrollbar', 'overflow'];\n"],"mappings":";;;;;;;;;;AAeA,SAAgB,eAAe,EAC7B,WACA,YAC4C;AAC5C,KAAI,CAAC,aAAa,cAAc,EAAG;CAEnC,MAAM,QAAQ,cAAc,QAAQ,cAAc,KAAK,SAAS;CAEhE,MAAM,EAAE,MAAM,QAAQ,WADJ,WAAW,OAAO,MAAM,CAAC,CACA,OAAO,MAAM,kBAAkB;CAE1E,MAAM,oBAAoB;CAC1B,MAAM,oBAAoB;AAE1B,KAAI,KAAK,SAAS,OAAO,CACvB,QAAO,CAAC,EAAE,mBAAmB,QAAQ,CAAC;CAGxC,MAAM,OAA+B,EAAE;CAEvC,MAAM,SAAS,OAAO,SAAS,OAAO;AAEtC,KAAI,KAAK,SAAS,OAAO,CACvB,MAAK,qBAAqB;UACjB,OACT,MAAK,qBAAqB;AAK5B,MAAK,qBAAqB,GAFP,SAAS,MAAM,kBAEM,GADrB,SAAS,MAAM;AAGlC,KAAI,KAAK,SAAS,SAAS,IAAI,KAAK,SAAS,aAAa,CACxD,MAAK,sBAAsB,KAAK,SAAS,aAAa,GAClD,sBACA;AAGN,KAAI,KAAK,SAAS,SAAS,EAAE;AAC3B,OAAK,cAAc,YAAY;AAE/B,MAAI,CAAC,KAAK,oBACR,MAAK,sBAAsB;;AAI/B,QAAO,CAAC,KAAK;;AAGf,eAAe,iBAAiB,CAAC,aAAa,WAAW"}
package/docs/styles.md CHANGED
@@ -489,33 +489,33 @@ If the name is not a semantic name, it is used as a literal CSS property name.
489
489
 
490
490
  ### `scrollbar`
491
491
 
492
- Cross-browser scrollbar styling. Sets Firefox (`scrollbar-width`, `scrollbar-color`) and WebKit (`::-webkit-scrollbar` pseudo-elements) properties.
492
+ Standards-based scrollbar styling using `scrollbar-width`, `scrollbar-color`, and `scrollbar-gutter`.
493
493
 
494
- **Syntax:** `[modifiers...] [size] [thumb-color] [track-color] [corner-color]`
494
+ **Syntax:** `[modifiers...] [thumb-color] [track-color]`
495
495
 
496
496
  **Modifiers:**
497
497
 
498
498
  | Modifier | Effect |
499
499
  |----------|--------|
500
500
  | `thin` | Thin scrollbar (`scrollbar-width: thin`) |
501
- | `none` | Hide scrollbar (still scrollable) |
502
- | `auto` | Browser-default scrollbar width |
501
+ | `none` | Hide scrollbar (content remains scrollable) |
502
+ | `auto` | Browser-default scrollbar width (`scrollbar-width: auto`) |
503
503
  | `stable` | Reserve space for scrollbar (`scrollbar-gutter: stable`) |
504
504
  | `both-edges` | Reserve space on both sides (`scrollbar-gutter: stable both-edges`) |
505
- | `always` | Force scrollbars visible (`overflow: scroll` + `scrollbar-gutter: stable`) |
506
- | `styled` | Enhanced appearance with rounded thumb, transitions, and custom sizing |
505
+ | `always` | Keep scrollbar visible when content overflows (`overflow: auto` + `scrollbar-gutter: stable`) |
507
506
 
508
- **Colors:** Up to 3 color values for thumb, track, and corner (optional).
507
+ **Colors:** Up to 2 color values for thumb and track (optional).
509
508
 
510
- **Defaults:** size = `8px`, thumb = `$scrollbar-thumb-color`, track = `transparent`, corner = same as track
509
+ **Defaults:** thumb = `$scrollbar-thumb-color`, track = `$scrollbar-track-color` (falls back to `transparent`)
511
510
 
512
511
  | Value | Effect |
513
512
  |-------|--------|
514
513
  | `true` | Thin scrollbar with default thumb/track colors |
515
- | `"none"` | Hidden scrollbar (still scrollable) |
516
- | `"thin 10px #purple.40 #dark.04"` | Thin, 10px, thumb `#purple.40`, track `#dark.04` |
517
- | `"styled 12px #purple.40 #dark.04 #white.10"` | Styled, 12px, thumb `#purple.40`, track `#dark.04`, corner `#white.10` |
518
- | `"always 8px #primary.50 #white.02"` | Always visible, 8px, thumb `#primary.50`, track `#white.02` |
514
+ | `"none"` | Hidden scrollbar (content remains scrollable) |
515
+ | `"thin #purple.40 #dark.04"` | Thin, thumb `#purple.40`, track `#dark.04` |
516
+ | `"always #primary.50 #white.02"` | Always visible with stable gutter, thumb `#primary.50`, track `#white.02` |
517
+ | `"thin stable"` | Thin scrollbar with reserved gutter space |
518
+ | `"thin both-edges"` | Thin scrollbar with gutter space on both sides |
519
519
 
520
520
  ### `fade`
521
521
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tenphi/tasty",
3
- "version": "0.0.0-snapshot.1afab2a",
3
+ "version": "0.0.0-snapshot.1c5dff6",
4
4
  "description": "A design-system-integrated styling system and DSL for concise, state-aware UI styling",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",