@monabbous/slidebox 1.1.0 → 1.3.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.
@@ -0,0 +1,125 @@
1
+ {
2
+ ".slidebox-range": {
3
+ "--_size": "var(--slidebox-size, 24px)",
4
+ "--_spacing": "var(--slidebox-spacing, .33)",
5
+ "--_range-inset": "max(0px, calc(var(--_size) * var(--_spacing) * .5))",
6
+ "--_thumb-size": "calc(var(--_size) * (1 - var(--_spacing)))",
7
+ "--_deform": "var(--slidebox-deform, .1)",
8
+ "--_duration": "var(--slidebox-duration, 200ms)",
9
+ "--_easing": "var(--slidebox-easing, ease-in-out)",
10
+ "--_track": "var(--slidebox-track, Field)",
11
+ "--_border": "var(--slidebox-border, ButtonBorder)",
12
+ "--_on": "var(--slidebox-on, var(--_accent, light-dark(#0b75ff, SelectedItem)))",
13
+ "appearance": "none",
14
+ "-webkit-appearance": "none",
15
+ "box-sizing": "border-box",
16
+ "width": "100%",
17
+ "min-width": "0",
18
+ "height": "var(--_size)",
19
+ "margin": "0",
20
+ "padding-block": "0",
21
+ "padding-inline": "var(--_range-inset)",
22
+ "border": "1px solid var(--_border)",
23
+ "border-radius": "var(--slidebox-radius, 100vw)",
24
+ "background": "var(--_track)",
25
+ "color": "var(--_on)",
26
+ "cursor": "pointer",
27
+ "accent-color": "var(--_on)",
28
+ "&[data-slidebox-range-fill]": {
29
+ "--_fill-size": "max(0px, min(var(--_thumb-size), calc(var(--_size) - 2px)))",
30
+ "--_fill-stop": "clamp(0px, calc(var(--_thumb-size) * .5 + (100% - var(--_thumb-size)) * clamp(0, var(--slidebox-range-fill, 0), 1)), 100%)",
31
+ "background-image": "radial-gradient(circle closest-side, var(--_fill-color, var(--_on)) calc(100% - .5px), transparent 100%),\n linear-gradient(to right, transparent 0 calc(var(--_fill-size) * .5), var(--_fill-color, var(--_on)) calc(var(--_fill-size) * .5) var(--_fill-stop), transparent var(--_fill-stop)),\n var(--_range-track-image, none)",
32
+ "background-size": "var(--_fill-size) var(--_fill-size), max(0px, calc(100% - 2 * var(--_range-inset))) var(--_fill-size), 100vw 100vh",
33
+ "background-position": "left var(--_range-inset) center, center, 0 0",
34
+ "background-repeat": "no-repeat",
35
+ "background-attachment": "scroll, scroll, fixed",
36
+ "background-clip": "padding-box"
37
+ },
38
+ "&[data-slidebox-range-fill]:dir(rtl)": {
39
+ "background-image": "radial-gradient(circle closest-side, var(--_fill-color, var(--_on)) calc(100% - .5px), transparent 100%),\n linear-gradient(to left, transparent 0 calc(var(--_fill-size) * .5), var(--_fill-color, var(--_on)) calc(var(--_fill-size) * .5) var(--_fill-stop), transparent var(--_fill-stop)),\n var(--_range-track-image, none)",
40
+ "background-position": "right var(--_range-inset) center, center, 0 0"
41
+ },
42
+ "&::-webkit-slider-runnable-track": {
43
+ "box-sizing": "border-box",
44
+ "height": "calc(var(--_size) - 2px)",
45
+ "border": "0",
46
+ "border-radius": "var(--slidebox-radius, 100vw)",
47
+ "background": "transparent"
48
+ },
49
+ "&::-moz-range-track": {
50
+ "box-sizing": "border-box",
51
+ "height": "calc(var(--_size) - 2px)",
52
+ "border": "0",
53
+ "border-radius": "var(--slidebox-radius, 100vw)",
54
+ "background": "transparent"
55
+ },
56
+ "&::-webkit-slider-thumb": {
57
+ "appearance": "none",
58
+ "-webkit-appearance": "none",
59
+ "box-sizing": "border-box",
60
+ "width": "calc(var(--_size) * (1 - var(--_spacing)))",
61
+ "height": "calc(var(--_size) * (1 - var(--_spacing)))",
62
+ "margin-top": "calc(var(--_size) * var(--_spacing) / 2 - 1px)",
63
+ "border": "1px solid var(--_track)",
64
+ "border-radius": "var(--slidebox-radius, 100vw)",
65
+ "background": "var(--_on)",
66
+ "transition": "none"
67
+ },
68
+ "&::-moz-range-thumb": {
69
+ "box-sizing": "border-box",
70
+ "width": "calc(var(--_size) * (1 - var(--_spacing)))",
71
+ "height": "calc(var(--_size) * (1 - var(--_spacing)))",
72
+ "border": "1px solid var(--_track)",
73
+ "border-radius": "var(--slidebox-radius, 100vw)",
74
+ "background": "var(--_on)",
75
+ "transition": "none"
76
+ },
77
+ "&:focus-visible": {
78
+ "outline": "2px solid var(--_on)",
79
+ "outline-offset": "3px"
80
+ },
81
+ "&[data-slidebox-range-dragging]::-webkit-slider-thumb": {
82
+ "background": "transparent",
83
+ "border-color": "transparent",
84
+ "transition": "none"
85
+ },
86
+ "&[data-slidebox-range-dragging]::-moz-range-thumb": {
87
+ "background": "transparent",
88
+ "border-color": "transparent",
89
+ "transition": "none"
90
+ },
91
+ "&:disabled": {
92
+ "cursor": "not-allowed",
93
+ "opacity": ".5"
94
+ },
95
+ "@supports (color: AccentColor)": {
96
+ "&": {
97
+ "--_accent": "AccentColor"
98
+ }
99
+ },
100
+ "@media (forced-colors: active)": {
101
+ "&": {
102
+ "--_track": "Field",
103
+ "--_border": "ButtonBorder",
104
+ "--_on": "Highlight"
105
+ },
106
+ "&::-webkit-slider-thumb": {
107
+ "border-color": "Highlight"
108
+ },
109
+ "&::-moz-range-thumb": {
110
+ "border-color": "Highlight"
111
+ }
112
+ },
113
+ "@media (prefers-reduced-motion: reduce)": {
114
+ "&": {
115
+ "transition-duration": ".01ms"
116
+ },
117
+ "&::-webkit-slider-thumb": {
118
+ "transition-duration": ".01ms"
119
+ },
120
+ "&::-moz-range-thumb": {
121
+ "transition-duration": ".01ms"
122
+ }
123
+ }
124
+ }
125
+ }
@@ -0,0 +1,152 @@
1
+ {
2
+ "--_size": "var(--slidebox-size, 36px)",
3
+ "--_spacing": "var(--slidebox-spacing, .12)",
4
+ "--_deform": "var(--slidebox-deform, .06)",
5
+ "--_duration": "var(--slidebox-duration, 200ms)",
6
+ "--_easing": "var(--slidebox-easing, ease-in-out)",
7
+ "--_track": "var(--slidebox-track, Field)",
8
+ "--_border": "var(--slidebox-border, ButtonBorder)",
9
+ "--_off": "var(--slidebox-off, FieldText)",
10
+ "--_on": "var(--slidebox-on, var(--_accent, light-dark(#0b75ff, SelectedItem)))",
11
+ "--_text": "var(--slidebox-text, var(--slidebox-off, FieldText))",
12
+ "--_selected-text": "var(--slidebox-selected-text, HighlightText)",
13
+ "--_press-start": "0px",
14
+ "--_press-end": "0px",
15
+ "display": "inline-grid",
16
+ "grid-auto-flow": "column",
17
+ "grid-auto-columns": "minmax(0, 1fr)",
18
+ "box-sizing": "border-box",
19
+ "padding": "calc(var(--_size) * var(--_spacing))",
20
+ "gap": "calc(var(--_size) * var(--_spacing))",
21
+ "border": "1px solid var(--_border)",
22
+ "border-radius": "var(--slidebox-radius, 100vw)",
23
+ "background": "var(--_track)",
24
+ "color": "var(--_text)",
25
+ "isolation": "isolate",
26
+ "position": "relative",
27
+ "& > label": {
28
+ "position": "relative",
29
+ "display": "grid",
30
+ "min-width": "0",
31
+ "cursor": "pointer"
32
+ },
33
+ "& > label > input[type=\"radio\"]": {
34
+ "position": "absolute",
35
+ "width": "1px",
36
+ "height": "1px",
37
+ "padding": "0",
38
+ "margin": "-1px",
39
+ "overflow": "hidden",
40
+ "clip-path": "inset(50%)",
41
+ "white-space": "nowrap"
42
+ },
43
+ "& > label > span": {
44
+ "position": "relative",
45
+ "isolation": "isolate",
46
+ "display": "grid",
47
+ "place-items": "center",
48
+ "box-sizing": "border-box",
49
+ "min-height": "var(--_size)",
50
+ "padding": ".35em 1em",
51
+ "border": "1px solid transparent",
52
+ "border-radius": "var(--slidebox-radius, 100vw)",
53
+ "color": "var(--_text)",
54
+ "background": "transparent",
55
+ "transition": "color var(--_duration) var(--_easing)"
56
+ },
57
+ "& > label > input:checked + span": {
58
+ "color": "var(--_selected-text)"
59
+ },
60
+ "& > label > input:checked + span::before": {
61
+ "content": "\"\"",
62
+ "position": "absolute",
63
+ "inset": "0",
64
+ "z-index": "-1",
65
+ "pointer-events": "none",
66
+ "border-radius": "inherit",
67
+ "background": "var(--_on)",
68
+ "margin-inline-start": "var(--_press-start)",
69
+ "margin-inline-end": "var(--_press-end)",
70
+ "transition": "margin-inline-start var(--_duration) var(--_easing), margin-inline-end var(--_duration) var(--_easing)"
71
+ },
72
+ "& > label > input:not(:checked) + span": {
73
+ "color": "var(--_text)"
74
+ },
75
+ "&:has(> label > input:checked):has(> label:active > input:not(:checked):not(:disabled)):not(:has(> label:active ~ label > input:checked))": {
76
+ "--_press-end": "calc(-1 * var(--_size) * var(--_deform))"
77
+ },
78
+ "&:has(> label:active > input:not(:disabled)):has(> label:active ~ label > input:checked)": {
79
+ "--_press-start": "calc(-1 * var(--_size) * var(--_deform))"
80
+ },
81
+ "& > label > input:focus-visible + span": {
82
+ "outline": "2px solid var(--_on)",
83
+ "outline-offset": "2px"
84
+ },
85
+ "& > label:has(> input:disabled)": {
86
+ "cursor": "not-allowed"
87
+ },
88
+ "& > label > input:disabled + span": {
89
+ "opacity": ".5"
90
+ },
91
+ "@supports (color: AccentColor)": {
92
+ "&": {
93
+ "--_accent": "AccentColor"
94
+ }
95
+ },
96
+ "@supports (anchor-scope: --slidebox-selection) and (left: anchor(left))": {
97
+ "&": {
98
+ "anchor-scope": "--slidebox-selection"
99
+ },
100
+ "& > label:has(> input:checked)": {
101
+ "anchor-name": "--slidebox-selection"
102
+ },
103
+ "&:has(> label > input:checked)::before": {
104
+ "content": "\"\"",
105
+ "position": "absolute",
106
+ "position-anchor": "--slidebox-selection",
107
+ "left": "anchor(left)",
108
+ "right": "anchor(right)",
109
+ "top": "anchor(top)",
110
+ "height": "anchor-size(height)",
111
+ "margin-inline-start": "var(--_press-start)",
112
+ "margin-inline-end": "var(--_press-end)",
113
+ "z-index": "-1",
114
+ "border-radius": "var(--slidebox-radius, 100vw)",
115
+ "background": "var(--_on)",
116
+ "pointer-events": "none",
117
+ "transition": "left var(--_duration) var(--_easing), right var(--_duration) var(--_easing), top var(--_duration) var(--_easing), height var(--_duration) var(--_easing), margin-inline-start var(--_duration) var(--_easing), margin-inline-end var(--_duration) var(--_easing)"
118
+ },
119
+ "& > label > input:checked + span::before": {
120
+ "content": "none"
121
+ }
122
+ },
123
+ "@media (forced-colors: active)": {
124
+ "&": {
125
+ "--_track": "Field",
126
+ "--_border": "ButtonBorder",
127
+ "--_off": "FieldText",
128
+ "--_on": "Highlight",
129
+ "--_text": "FieldText",
130
+ "--_selected-text": "HighlightText"
131
+ },
132
+ "& > label > input:checked + span": {
133
+ "border-color": "Highlight",
134
+ "outline": "2px solid Highlight",
135
+ "outline-offset": "-2px"
136
+ },
137
+ "& > label > input:disabled + span": {
138
+ "color": "GrayText"
139
+ }
140
+ },
141
+ "@media (prefers-reduced-motion: reduce)": {
142
+ "& > label > span": {
143
+ "transition-duration": ".01ms"
144
+ },
145
+ "& > label > input:checked + span::before": {
146
+ "transition-duration": ".01ms"
147
+ },
148
+ "&::before": {
149
+ "transition-duration": ".01ms"
150
+ }
151
+ }
152
+ }
@@ -1,5 +1,7 @@
1
1
  const plugin = require("tailwindcss/plugin");
2
2
  const rules = require("./rules.json");
3
+ const groupRules = require("./group-rules.json");
4
+ const experimentalRules = require("./experimental-rules.json");
3
5
 
4
6
  function flatten(colors, prefix = "") {
5
7
  return Object.fromEntries(Object.entries(colors).flatMap(([key, value]) => {
@@ -10,17 +12,17 @@ function flatten(colors, prefix = "") {
10
12
  }
11
13
 
12
14
  module.exports = plugin.withOptions((defaults = {}) => ({ addUtilities, matchUtilities, theme }) => {
13
- const controls = ["size", "width", "spacing", "deform", "duration", "easing", "track", "border", "off", "on"];
15
+ const controls = ["size", "width", "spacing", "deform", "duration", "easing", "track", "border", "off", "on", "radius", "text", "selected-text"];
14
16
  for (const key of Object.keys(defaults)) {
15
17
  if (!controls.includes(key)) throw new Error(`Unknown Slidebox control: ${key}`);
16
18
  }
17
- addUtilities({ ".slidebox": {
18
- ...Object.fromEntries(Object.entries(defaults).map(([key, value]) => [`--slidebox-${key}`, String(value)])),
19
- ...rules,
20
- } });
19
+ const properties = Object.fromEntries(Object.entries(defaults).map(([key, value]) => [`--slidebox-${key}`, String(value)]));
20
+ addUtilities(Object.fromEntries(Object.entries({ ".slidebox": rules, ".slidebox-group": groupRules, ...experimentalRules })
21
+ .map(([selector, component]) => [selector, { ...properties, ...component }])));
21
22
  for (const key of controls) {
22
23
  let values = theme(`slidebox.${key}`, {});
23
- if (["track", "border", "off", "on"].includes(key)) values = { ...flatten(theme("colors", {})), ...values };
24
+ if (["track", "border", "off", "on", "text", "selected-text"].includes(key)) values = { ...flatten(theme("colors", {})), ...values };
25
+ if (key === "radius") values = { ...theme("borderRadius", {}), ...values };
24
26
  if (key === "duration") values = { ...theme("transitionDuration", {}), ...values };
25
27
  if (key === "easing") values = { ...theme("transitionTimingFunction", {}), ...values };
26
28
  matchUtilities({ [`slidebox-${key}`]: value => ({ [`--slidebox-${key}`]: value }) }, { values });
@@ -30,6 +30,7 @@
30
30
  "&::after": {
31
31
  "--_start": "0",
32
32
  "--_end": "1",
33
+ "box-sizing": "border-box",
33
34
  "content": "\"\"",
34
35
  "display": "block",
35
36
  "flex": "1 1 auto",
@@ -40,6 +41,7 @@
40
41
  "margin-inline-start": "calc((1em * var(--_container-width-ratio) - 1em) * var(--_start) + var(--_thumb-spacing-ratio) * .5em)",
41
42
  "margin-inline-end": "calc((1em * var(--_container-width-ratio) - 1em) * var(--_end) + var(--_thumb-spacing-ratio) * .5em)",
42
43
  "border-radius": "inherit",
44
+ "border": "1px solid var(--_track)",
43
45
  "background": "var(--_off)",
44
46
  "transition": "background var(--_duration) var(--_easing-function), margin-inline-start var(--_duration) var(--_easing-function), margin-inline-end var(--_duration) var(--_easing-function)",
45
47
  "transition-delay": "0s, 0s, calc(var(--_duration) * var(--_deform))"
@@ -60,6 +62,11 @@
60
62
  "cursor": "not-allowed",
61
63
  "opacity": ".5"
62
64
  },
65
+ "&[data-slidebox-dragging]::after": {
66
+ "margin-inline-start": "calc((1em * var(--_container-width-ratio) - 1em) * max(0, var(--slidebox-drag-progress) - max(0, var(--slidebox-drag-stretch, 0))) + var(--_thumb-spacing-ratio) * .5em)",
67
+ "margin-inline-end": "calc((1em * var(--_container-width-ratio) - 1em) * max(0, 1 - var(--slidebox-drag-progress) - max(0, -1 * var(--slidebox-drag-stretch, 0))) + var(--_thumb-spacing-ratio) * .5em)",
68
+ "transition": "none"
69
+ },
63
70
  "@media (forced-colors: active)": {
64
71
  "&": {
65
72
  "--_track": "Field",