@mekari/pixel3-slider 0.0.1-dev.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,103 @@
1
+ import * as vue_jsx_runtime from 'vue/jsx-runtime';
2
+ import * as _mekari_pixel3_styled_system_tokens from '@mekari/pixel3-styled-system/tokens';
3
+ import * as _mekari_pixel3_utils from '@mekari/pixel3-utils';
4
+ import * as vue from 'vue';
5
+
6
+ declare const MpSlider: vue.DefineComponent<{
7
+ id: {
8
+ type: StringConstructor;
9
+ default: string;
10
+ };
11
+ value: {
12
+ type: vue.PropType<number | number[]>;
13
+ default: number;
14
+ };
15
+ min: {
16
+ type: NumberConstructor;
17
+ default: number;
18
+ };
19
+ max: {
20
+ type: NumberConstructor;
21
+ default: number;
22
+ };
23
+ step: {
24
+ type: NumberConstructor;
25
+ default: number;
26
+ };
27
+ variant: {
28
+ type: vue.PropType<"single" | "range">;
29
+ default: string;
30
+ };
31
+ color: {
32
+ type: vue.PropType<_mekari_pixel3_utils.CombinedString | _mekari_pixel3_styled_system_tokens.ColorToken>;
33
+ default: string;
34
+ };
35
+ gradientColor: {
36
+ type: vue.PropType<_mekari_pixel3_styled_system_tokens.ColorToken[] | _mekari_pixel3_utils.CombinedString[]>;
37
+ default: () => string[];
38
+ };
39
+ isGradient: {
40
+ type: BooleanConstructor;
41
+ default: boolean;
42
+ };
43
+ isDisabled: {
44
+ type: BooleanConstructor;
45
+ default: boolean;
46
+ };
47
+ }, () => vue_jsx_runtime.JSX.Element, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, string[], string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
48
+ id: {
49
+ type: StringConstructor;
50
+ default: string;
51
+ };
52
+ value: {
53
+ type: vue.PropType<number | number[]>;
54
+ default: number;
55
+ };
56
+ min: {
57
+ type: NumberConstructor;
58
+ default: number;
59
+ };
60
+ max: {
61
+ type: NumberConstructor;
62
+ default: number;
63
+ };
64
+ step: {
65
+ type: NumberConstructor;
66
+ default: number;
67
+ };
68
+ variant: {
69
+ type: vue.PropType<"single" | "range">;
70
+ default: string;
71
+ };
72
+ color: {
73
+ type: vue.PropType<_mekari_pixel3_utils.CombinedString | _mekari_pixel3_styled_system_tokens.ColorToken>;
74
+ default: string;
75
+ };
76
+ gradientColor: {
77
+ type: vue.PropType<_mekari_pixel3_styled_system_tokens.ColorToken[] | _mekari_pixel3_utils.CombinedString[]>;
78
+ default: () => string[];
79
+ };
80
+ isGradient: {
81
+ type: BooleanConstructor;
82
+ default: boolean;
83
+ };
84
+ isDisabled: {
85
+ type: BooleanConstructor;
86
+ default: boolean;
87
+ };
88
+ }>> & {
89
+ [x: `on${Capitalize<string>}`]: ((...args: any[]) => any) | undefined;
90
+ }, {
91
+ color: _mekari_pixel3_utils.CombinedString | _mekari_pixel3_styled_system_tokens.ColorToken;
92
+ id: string;
93
+ value: number | number[];
94
+ max: number;
95
+ min: number;
96
+ step: number;
97
+ variant: "single" | "range";
98
+ gradientColor: _mekari_pixel3_styled_system_tokens.ColorToken[] | _mekari_pixel3_utils.CombinedString[];
99
+ isGradient: boolean;
100
+ isDisabled: boolean;
101
+ }, {}>;
102
+
103
+ export { MpSlider };
@@ -0,0 +1,103 @@
1
+ import * as vue_jsx_runtime from 'vue/jsx-runtime';
2
+ import * as _mekari_pixel3_styled_system_tokens from '@mekari/pixel3-styled-system/tokens';
3
+ import * as _mekari_pixel3_utils from '@mekari/pixel3-utils';
4
+ import * as vue from 'vue';
5
+
6
+ declare const MpSlider: vue.DefineComponent<{
7
+ id: {
8
+ type: StringConstructor;
9
+ default: string;
10
+ };
11
+ value: {
12
+ type: vue.PropType<number | number[]>;
13
+ default: number;
14
+ };
15
+ min: {
16
+ type: NumberConstructor;
17
+ default: number;
18
+ };
19
+ max: {
20
+ type: NumberConstructor;
21
+ default: number;
22
+ };
23
+ step: {
24
+ type: NumberConstructor;
25
+ default: number;
26
+ };
27
+ variant: {
28
+ type: vue.PropType<"single" | "range">;
29
+ default: string;
30
+ };
31
+ color: {
32
+ type: vue.PropType<_mekari_pixel3_utils.CombinedString | _mekari_pixel3_styled_system_tokens.ColorToken>;
33
+ default: string;
34
+ };
35
+ gradientColor: {
36
+ type: vue.PropType<_mekari_pixel3_styled_system_tokens.ColorToken[] | _mekari_pixel3_utils.CombinedString[]>;
37
+ default: () => string[];
38
+ };
39
+ isGradient: {
40
+ type: BooleanConstructor;
41
+ default: boolean;
42
+ };
43
+ isDisabled: {
44
+ type: BooleanConstructor;
45
+ default: boolean;
46
+ };
47
+ }, () => vue_jsx_runtime.JSX.Element, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, string[], string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
48
+ id: {
49
+ type: StringConstructor;
50
+ default: string;
51
+ };
52
+ value: {
53
+ type: vue.PropType<number | number[]>;
54
+ default: number;
55
+ };
56
+ min: {
57
+ type: NumberConstructor;
58
+ default: number;
59
+ };
60
+ max: {
61
+ type: NumberConstructor;
62
+ default: number;
63
+ };
64
+ step: {
65
+ type: NumberConstructor;
66
+ default: number;
67
+ };
68
+ variant: {
69
+ type: vue.PropType<"single" | "range">;
70
+ default: string;
71
+ };
72
+ color: {
73
+ type: vue.PropType<_mekari_pixel3_utils.CombinedString | _mekari_pixel3_styled_system_tokens.ColorToken>;
74
+ default: string;
75
+ };
76
+ gradientColor: {
77
+ type: vue.PropType<_mekari_pixel3_styled_system_tokens.ColorToken[] | _mekari_pixel3_utils.CombinedString[]>;
78
+ default: () => string[];
79
+ };
80
+ isGradient: {
81
+ type: BooleanConstructor;
82
+ default: boolean;
83
+ };
84
+ isDisabled: {
85
+ type: BooleanConstructor;
86
+ default: boolean;
87
+ };
88
+ }>> & {
89
+ [x: `on${Capitalize<string>}`]: ((...args: any[]) => any) | undefined;
90
+ }, {
91
+ color: _mekari_pixel3_utils.CombinedString | _mekari_pixel3_styled_system_tokens.ColorToken;
92
+ id: string;
93
+ value: number | number[];
94
+ max: number;
95
+ min: number;
96
+ step: number;
97
+ variant: "single" | "range";
98
+ gradientColor: _mekari_pixel3_styled_system_tokens.ColorToken[] | _mekari_pixel3_utils.CombinedString[];
99
+ isGradient: boolean;
100
+ isDisabled: boolean;
101
+ }, {}>;
102
+
103
+ export { MpSlider };
package/dist/slider.js ADDED
@@ -0,0 +1,341 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/slider.tsx
22
+ var slider_exports = {};
23
+ __export(slider_exports, {
24
+ MpSlider: () => MpSlider
25
+ });
26
+ module.exports = __toCommonJS(slider_exports);
27
+ var import_vue2 = require("vue");
28
+ var import_vue3 = require("vue");
29
+ var import_pixel3_text = require("@mekari/pixel3-text");
30
+
31
+ // src/modules/slider.hooks.ts
32
+ var import_vue = require("vue");
33
+ var import_pixel3_utils = require("@mekari/pixel3-utils");
34
+ var import_css = require("@mekari/pixel3-styled-system/css");
35
+ var import_tokens = require("@mekari/pixel3-styled-system/tokens");
36
+ var import_recipes = require("@mekari/pixel3-styled-system/recipes");
37
+ function useSlider(props, emit) {
38
+ const {
39
+ id,
40
+ value,
41
+ min,
42
+ max,
43
+ step,
44
+ variant,
45
+ color,
46
+ gradientColor,
47
+ isGradient,
48
+ isDisabled
49
+ } = (0, import_vue.toRefs)(props);
50
+ const currentValue = (0, import_vue.ref)(value.value);
51
+ const isMinPressed = (0, import_vue.ref)(false);
52
+ const isMaxPressed = (0, import_vue.ref)(false);
53
+ const getId = id.value || (0, import_pixel3_utils.getUniqueId)("", "slider").value;
54
+ const rootAttrs = (0, import_vue.computed)(() => {
55
+ return {
56
+ "data-pixel-component": "MpSlider",
57
+ id: getId,
58
+ class: (0, import_recipes.sliderSlotRecipe)().root
59
+ };
60
+ });
61
+ const labelWrapperAttrs = (0, import_vue.computed)(() => {
62
+ return {
63
+ class: (0, import_recipes.sliderSlotRecipe)().labelWrapper
64
+ };
65
+ });
66
+ const sliderWrapperAttrs = (0, import_vue.computed)(() => {
67
+ return {
68
+ class: (0, import_recipes.sliderSlotRecipe)().sliderWrapper
69
+ };
70
+ });
71
+ const progressAttrs = (0, import_vue.computed)(() => {
72
+ const background = isGradient.value ? handleGradientColor(gradientColor.value) : (0, import_tokens.token)(`colors.${color.value}`) || color.value;
73
+ return {
74
+ class: (0, import_recipes.sliderSlotRecipe)().progress,
75
+ style: {
76
+ background
77
+ }
78
+ };
79
+ });
80
+ const sliderAttrs = (0, import_vue.computed)(() => {
81
+ const leftValue = isRangeSlider.value ? 0 : (currentValue.value - min.value) / (max.value - min.value) * 100;
82
+ const rightValue = 0;
83
+ const background = isRangeSlider.value ? `linear-gradient(to right, #EDF0F2 ${minRangeValue.value}%, transparent ${minRangeValue.value}%, transparent ${maxRangeValue.value}%, #EDF0F2 ${maxRangeValue.value}%)` : (0, import_tokens.token)("colors.gray.50");
84
+ return {
85
+ class: (0, import_recipes.sliderSlotRecipe)().slider,
86
+ style: {
87
+ background,
88
+ left: `${leftValue}%`,
89
+ right: `${rightValue}%`
90
+ }
91
+ };
92
+ });
93
+ const inputWrapperAttrs = (0, import_vue.computed)(() => {
94
+ return {
95
+ class: (0, import_recipes.sliderSlotRecipe)().inputWrapper
96
+ };
97
+ });
98
+ const inputMinAttrs = (0, import_vue.computed)(() => {
99
+ return {
100
+ id: `input-min-${getId}`,
101
+ type: "range",
102
+ min: min.value,
103
+ max: max.value,
104
+ step: step.value,
105
+ value: isRangeSlider.value ? minRangeValue.value : currentValue.value,
106
+ disabled: isDisabled.value,
107
+ class: (0, import_css.cx)((0, import_recipes.sliderSlotRecipe)().input, (0, import_css.css)({
108
+ pointerEvents: isRangeSlider.value ? "none" : "auto",
109
+ "&::-webkit-slider-thumb": {
110
+ background: isDisabled.value ? "radial-gradient(circle, #D0D6DD 40%, white 50%)" : "radial-gradient(circle, #4B61DD 40%, white 50%)",
111
+ borderWidth: isMinPressed.value ? "1.5px" : "1px",
112
+ cursor: isDisabled.value ? "not-allowed" : "pointer",
113
+ _hover: {
114
+ borderColor: isMinPressed.value ? "blue.400" : "gray.400"
115
+ }
116
+ }
117
+ })),
118
+ onInput: (e) => handleInput(e, "min"),
119
+ onChange: handleChange,
120
+ onMouseup: handleRelease,
121
+ onMousedown: () => handlePress("min")
122
+ };
123
+ });
124
+ const inputMaxAttrs = (0, import_vue.computed)(() => {
125
+ return {
126
+ id: `input-max-${getId}`,
127
+ type: "range",
128
+ min: min.value,
129
+ max: max.value,
130
+ step: step.value,
131
+ value: maxRangeValue.value,
132
+ disabled: isDisabled.value,
133
+ class: (0, import_css.cx)((0, import_recipes.sliderSlotRecipe)().input, (0, import_css.css)({
134
+ pointerEvents: "none",
135
+ "&::-webkit-slider-thumb": {
136
+ background: isDisabled.value ? "radial-gradient(circle, #D0D6DD 40%, white 50%)" : "radial-gradient(circle, #4B61DD 40%, white 50%)",
137
+ borderWidth: isMaxPressed.value ? "1.5px" : "1px",
138
+ cursor: isDisabled.value ? "not-allowed" : "pointer",
139
+ _hover: {
140
+ borderColor: isMaxPressed.value ? "blue.400" : "gray.400"
141
+ }
142
+ }
143
+ })),
144
+ onInput: (e) => handleInput(e, "max"),
145
+ onChange: handleChange,
146
+ onMouseup: handleRelease,
147
+ onMousedown: () => handlePress("max")
148
+ };
149
+ });
150
+ const legendWrapperAttrs = (0, import_vue.computed)(() => {
151
+ return {
152
+ class: (0, import_recipes.sliderSlotRecipe)().labelWrapper
153
+ };
154
+ });
155
+ const isRangeSlider = (0, import_vue.computed)(() => {
156
+ return variant.value === "range";
157
+ });
158
+ const minRangeValue = (0, import_vue.computed)(() => {
159
+ return isRangeSlider.value && Array.isArray(currentValue.value) && currentValue.value[0];
160
+ });
161
+ const maxRangeValue = (0, import_vue.computed)(() => {
162
+ return isRangeSlider.value && Array.isArray(currentValue.value) && currentValue.value[1];
163
+ });
164
+ function handleInput(e, type) {
165
+ const target = e.target;
166
+ emit("input", target.value);
167
+ if (type === "min") {
168
+ if (isRangeSlider.value && Array.isArray(currentValue.value)) {
169
+ currentValue.value[0] = Number(target.value);
170
+ if (typeof maxRangeValue.value === "number" && typeof minRangeValue.value === "number") {
171
+ if (minRangeValue.value > maxRangeValue.value) {
172
+ currentValue.value[0] = maxRangeValue.value;
173
+ }
174
+ }
175
+ } else {
176
+ currentValue.value = Number(target.value);
177
+ }
178
+ }
179
+ if (type === "max" && Array.isArray(currentValue.value)) {
180
+ currentValue.value[1] = Number(target.value);
181
+ if (typeof maxRangeValue.value === "number" && typeof minRangeValue.value === "number") {
182
+ if (minRangeValue.value > maxRangeValue.value) {
183
+ currentValue.value[1] = minRangeValue.value;
184
+ }
185
+ }
186
+ }
187
+ }
188
+ __name(handleInput, "handleInput");
189
+ function handleChange() {
190
+ emit("change", currentValue.value);
191
+ }
192
+ __name(handleChange, "handleChange");
193
+ function handleRelease() {
194
+ isMinPressed.value = false;
195
+ isMaxPressed.value = false;
196
+ emit("drag-end");
197
+ }
198
+ __name(handleRelease, "handleRelease");
199
+ function handlePress(type) {
200
+ type === "min" ? isMinPressed.value = true : isMaxPressed.value = true;
201
+ emit("drag-start");
202
+ }
203
+ __name(handlePress, "handlePress");
204
+ function handleGradientColor(colors) {
205
+ const stepPercentage = 100 / (colors.length - 1);
206
+ const gradientParts = colors.map((color2, index) => {
207
+ const position = index * stepPercentage;
208
+ return `${(0, import_tokens.token)(`colors.${color2}`) || color2} ${position}%`;
209
+ });
210
+ const gradientStr = `linear-gradient(to right, ${gradientParts.join(", ")})`;
211
+ return gradientStr;
212
+ }
213
+ __name(handleGradientColor, "handleGradientColor");
214
+ return {
215
+ rootAttrs,
216
+ labelWrapperAttrs,
217
+ sliderWrapperAttrs,
218
+ sliderAttrs,
219
+ progressAttrs,
220
+ inputWrapperAttrs,
221
+ inputMinAttrs,
222
+ inputMaxAttrs,
223
+ legendWrapperAttrs,
224
+ isRangeSlider,
225
+ currentValue,
226
+ minRangeValue,
227
+ maxRangeValue
228
+ };
229
+ }
230
+ __name(useSlider, "useSlider");
231
+
232
+ // src/modules/slider.props.ts
233
+ var sliderProps = {
234
+ id: {
235
+ type: String,
236
+ default: ""
237
+ },
238
+ value: {
239
+ type: [Number, Array],
240
+ default: 0
241
+ },
242
+ min: {
243
+ type: Number,
244
+ default: 0
245
+ },
246
+ max: {
247
+ type: Number,
248
+ default: 100
249
+ },
250
+ step: {
251
+ type: Number,
252
+ default: 1
253
+ },
254
+ variant: {
255
+ type: String,
256
+ default: "single"
257
+ },
258
+ color: {
259
+ type: String,
260
+ default: "sky.100"
261
+ },
262
+ gradientColor: {
263
+ type: Array,
264
+ default: () => ["blue.50", "blue.100", "blue.400", "blue.700"]
265
+ },
266
+ isGradient: {
267
+ type: Boolean,
268
+ default: false
269
+ },
270
+ isDisabled: {
271
+ type: Boolean,
272
+ default: false
273
+ }
274
+ };
275
+ var sliderEmits = ["input", "change", "drag-end", "drag-start"];
276
+
277
+ // src/slider.tsx
278
+ var MpSlider = (0, import_vue3.defineComponent)({
279
+ name: "MpSlider",
280
+ props: sliderProps,
281
+ emits: sliderEmits,
282
+ setup(props, {
283
+ slots,
284
+ emit
285
+ }) {
286
+ const {
287
+ rootAttrs,
288
+ labelWrapperAttrs,
289
+ sliderWrapperAttrs,
290
+ sliderAttrs,
291
+ progressAttrs,
292
+ inputWrapperAttrs,
293
+ inputMinAttrs,
294
+ inputMaxAttrs,
295
+ legendWrapperAttrs,
296
+ isRangeSlider,
297
+ currentValue,
298
+ minRangeValue,
299
+ maxRangeValue
300
+ } = useSlider(props, emit);
301
+ return () => {
302
+ const {
303
+ min,
304
+ max
305
+ } = props;
306
+ const label = slots.label && slots.label();
307
+ const value = slots.value && slots.value({
308
+ value: currentValue.value
309
+ });
310
+ const minSlots = slots.min && slots.min();
311
+ const maxSlots = slots.max && slots.max();
312
+ const valueText = isRangeSlider.value ? `${minRangeValue.value} - ${maxRangeValue.value}` : currentValue.value;
313
+ return (0, import_vue2.createVNode)("div", rootAttrs.value, [(0, import_vue2.createVNode)("div", labelWrapperAttrs.value, [(0, import_vue2.createVNode)(import_pixel3_text.MpText, {
314
+ "size": "label",
315
+ "color": "dark"
316
+ }, {
317
+ default: () => [label ? label : "Label"]
318
+ }), (0, import_vue2.createVNode)(import_pixel3_text.MpText, {
319
+ "size": "label",
320
+ "color": "dark",
321
+ "weight": "semiBold"
322
+ }, {
323
+ default: () => [value ? value : valueText]
324
+ })]), (0, import_vue2.createVNode)("div", sliderWrapperAttrs.value, [(0, import_vue2.createVNode)("div", progressAttrs.value, [(0, import_vue2.createVNode)("div", sliderAttrs.value, null)]), (0, import_vue2.createVNode)("div", inputWrapperAttrs.value, [(0, import_vue2.createVNode)("input", inputMinAttrs.value, null), isRangeSlider.value && (0, import_vue2.createVNode)("input", inputMaxAttrs.value, null)])]), (0, import_vue2.createVNode)("div", legendWrapperAttrs.value, [(0, import_vue2.createVNode)(import_pixel3_text.MpText, {
325
+ "size": "label-small",
326
+ "color": "gray.600"
327
+ }, {
328
+ default: () => [minSlots ? minSlots : min]
329
+ }), (0, import_vue2.createVNode)(import_pixel3_text.MpText, {
330
+ "size": "label-small",
331
+ "color": "gray.600"
332
+ }, {
333
+ default: () => [maxSlots ? maxSlots : max]
334
+ })])]);
335
+ };
336
+ }
337
+ });
338
+ // Annotate the CommonJS export names for ESM import in node:
339
+ 0 && (module.exports = {
340
+ MpSlider
341
+ });
@@ -0,0 +1,9 @@
1
+ import {
2
+ MpSlider
3
+ } from "./chunk-BEKWS6QE.mjs";
4
+ import "./chunk-KTN7D244.mjs";
5
+ import "./chunk-SXAHQ4O2.mjs";
6
+ import "./chunk-QZ7VFGWC.mjs";
7
+ export {
8
+ MpSlider
9
+ };
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@mekari/pixel3-slider",
3
+ "description": "Slider component for mekari pixel 3",
4
+ "version": "0.0.1-dev.0",
5
+ "main": "dist/index.js",
6
+ "license": "MIT",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "dependencies": {
11
+ "@mekari/pixel3-styled-system": "0.0.10-dev.1",
12
+ "@mekari/pixel3-text": "0.0.12-dev.1",
13
+ "@mekari/pixel3-utils": "0.0.6"
14
+ },
15
+ "peerDependencies": {
16
+ "vue": "^3.4.9"
17
+ },
18
+ "devDependencies": {
19
+ "vue": "^3.4.9"
20
+ },
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "module": "dist/index.mjs",
25
+ "types": "dist/index.d.ts",
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "require": "./dist/index.js",
30
+ "default": "./dist/index.mjs"
31
+ }
32
+ },
33
+ "scripts": {
34
+ "clean": "rimraf dist .turbo",
35
+ "build": "tsup && pnpm build:types",
36
+ "build:fast": "tsup",
37
+ "build:types": "tsup src --dts-only",
38
+ "types:check": "tsc --noEmit",
39
+ "replace-config": "clean-package",
40
+ "restore-config": "clean-package restore"
41
+ }
42
+ }