@bluerobotics/bluevue 0.1.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.
- package/LICENSE +21 -0
- package/README.md +113 -0
- package/dist/bluevue.js +1176 -0
- package/dist/components/BlueButtonGroup.vue.d.ts +101 -0
- package/dist/components/BlueExpansiblePanel.vue.d.ts +38 -0
- package/dist/components/BlueInput.vue.d.ts +70 -0
- package/dist/components/BlueLoadingDialog.vue.d.ts +27 -0
- package/dist/components/BlueMenu.vue.d.ts +57 -0
- package/dist/components/BluePromptDialog.vue.d.ts +37 -0
- package/dist/components/BlueSelect.vue.d.ts +76 -0
- package/dist/components/BlueSlider.vue.d.ts +51 -0
- package/dist/components/BlueSwitch.vue.d.ts +39 -0
- package/dist/composables/useBluePopover.d.ts +38 -0
- package/dist/index.d.ts +10 -0
- package/dist/style.css +2 -0
- package/package.json +64 -0
- package/src/assets/br-logo-white.svg +1 -0
- package/src/components/BlueButtonGroup.vue +382 -0
- package/src/components/BlueExpansiblePanel.vue +72 -0
- package/src/components/BlueInput.vue +247 -0
- package/src/components/BlueLoadingDialog.vue +76 -0
- package/src/components/BlueMenu.vue +119 -0
- package/src/components/BluePromptDialog.vue +151 -0
- package/src/components/BlueSelect.vue +236 -0
- package/src/components/BlueSlider.vue +464 -0
- package/src/components/BlueSwitch.vue +117 -0
- package/src/composables/useBluePopover.ts +153 -0
- package/src/index.ts +11 -0
- package/src/styles/bluevue.css +124 -0
- package/src/styles/bundled.css +9 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One button in the group
|
|
3
|
+
*/
|
|
4
|
+
interface ButtonItem {
|
|
5
|
+
/** Name of the button, displayed as text */
|
|
6
|
+
name: string;
|
|
7
|
+
/** Optional tooltip text displayed on hover */
|
|
8
|
+
tooltip?: string;
|
|
9
|
+
/** Whether this button is pre-selected (only for 'switch' type) */
|
|
10
|
+
preSelected?: boolean;
|
|
11
|
+
/** Optional color for the button when active */
|
|
12
|
+
activeColor?: string;
|
|
13
|
+
/** Whether the button is disabled */
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
/** Callback when the button is selected */
|
|
16
|
+
onSelected?: () => void;
|
|
17
|
+
/** Custom options to handle button item press */
|
|
18
|
+
options?: Record<string, any>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* One item in the menu
|
|
22
|
+
*/
|
|
23
|
+
interface MenuItem {
|
|
24
|
+
/** Name of the menu item, displayed as text */
|
|
25
|
+
name: string;
|
|
26
|
+
/** Callback when the menu item is clicked */
|
|
27
|
+
action: () => void;
|
|
28
|
+
/** Disable the menu item */
|
|
29
|
+
menuItemDisabled?: boolean;
|
|
30
|
+
}
|
|
31
|
+
type __VLS_Props = {
|
|
32
|
+
/** List of buttons in the group */
|
|
33
|
+
buttonItems: ButtonItem[];
|
|
34
|
+
/** Optional menu items to display in a dropdown */
|
|
35
|
+
buttonsMenu?: MenuItem[];
|
|
36
|
+
/** Whether the entire button group is disabled */
|
|
37
|
+
disabled?: boolean;
|
|
38
|
+
/** Theme of the button group */
|
|
39
|
+
theme?: 'light' | 'dark';
|
|
40
|
+
/** Type of button group, 'switch' for single selection or 'toggle' for multiple selections */
|
|
41
|
+
type: 'switch' | 'toggle';
|
|
42
|
+
/** Height of the button group container */
|
|
43
|
+
height?: string;
|
|
44
|
+
/** Label text on the left side of the button group */
|
|
45
|
+
label?: string;
|
|
46
|
+
/** Optional info tooltip shown via an info icon next to the control. */
|
|
47
|
+
infoTooltip?: string;
|
|
48
|
+
/**
|
|
49
|
+
* How much room each button gives its name (default 'comfortable'). 'compact' also makes the
|
|
50
|
+
* group shorter and its labels smaller, for rows where the group is a secondary control.
|
|
51
|
+
*/
|
|
52
|
+
density?: 'compact' | 'regular' | 'comfortable';
|
|
53
|
+
};
|
|
54
|
+
declare function __VLS_template(): {
|
|
55
|
+
attrs: Partial<{}>;
|
|
56
|
+
slots: {
|
|
57
|
+
insetElement?(_: {}): any;
|
|
58
|
+
};
|
|
59
|
+
refs: {
|
|
60
|
+
rowRef: HTMLDivElement;
|
|
61
|
+
labelRef: HTMLLabelElement;
|
|
62
|
+
trackRef: HTMLDivElement;
|
|
63
|
+
menuAnchorRef: HTMLButtonElement;
|
|
64
|
+
menuPopoverRef: HTMLDivElement;
|
|
65
|
+
};
|
|
66
|
+
rootEl: HTMLDivElement;
|
|
67
|
+
};
|
|
68
|
+
type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
|
|
69
|
+
declare const __VLS_component: import('vue').DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, unknown, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
70
|
+
"update:selected": (value: boolean[]) => void;
|
|
71
|
+
"context-menu": (value: {
|
|
72
|
+
item: ButtonItem;
|
|
73
|
+
index: number;
|
|
74
|
+
x: number;
|
|
75
|
+
y: number;
|
|
76
|
+
}) => void;
|
|
77
|
+
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>> & {
|
|
78
|
+
"onUpdate:selected"?: ((value: boolean[]) => any) | undefined;
|
|
79
|
+
"onContext-menu"?: ((value: {
|
|
80
|
+
item: ButtonItem;
|
|
81
|
+
index: number;
|
|
82
|
+
x: number;
|
|
83
|
+
y: number;
|
|
84
|
+
}) => any) | undefined;
|
|
85
|
+
}, {}, {}>;
|
|
86
|
+
declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
|
|
87
|
+
export default _default;
|
|
88
|
+
type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
|
|
89
|
+
type __VLS_TypePropsToOption<T> = {
|
|
90
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
91
|
+
type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
|
|
92
|
+
} : {
|
|
93
|
+
type: import('vue').PropType<T[K]>;
|
|
94
|
+
required: true;
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
type __VLS_WithTemplateSlots<T, S> = T & {
|
|
98
|
+
new (): {
|
|
99
|
+
$slots: S;
|
|
100
|
+
};
|
|
101
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
/** Panel title */
|
|
3
|
+
title: string;
|
|
4
|
+
/** Initial open state */
|
|
5
|
+
expanded?: boolean;
|
|
6
|
+
/** 'light' or 'dark' theme */
|
|
7
|
+
theme?: 'light' | 'dark';
|
|
8
|
+
};
|
|
9
|
+
declare function __VLS_template(): {
|
|
10
|
+
attrs: Partial<{}>;
|
|
11
|
+
slots: {
|
|
12
|
+
default?(_: {}): any;
|
|
13
|
+
};
|
|
14
|
+
refs: {};
|
|
15
|
+
rootEl: HTMLDivElement;
|
|
16
|
+
};
|
|
17
|
+
type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
|
|
18
|
+
declare const __VLS_component: import('vue').DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, unknown, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
19
|
+
"update:expanded": (value: boolean) => void;
|
|
20
|
+
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>> & {
|
|
21
|
+
"onUpdate:expanded"?: ((value: boolean) => any) | undefined;
|
|
22
|
+
}, {}, {}>;
|
|
23
|
+
declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
|
|
24
|
+
export default _default;
|
|
25
|
+
type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
|
|
26
|
+
type __VLS_TypePropsToOption<T> = {
|
|
27
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
28
|
+
type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
|
|
29
|
+
} : {
|
|
30
|
+
type: import('vue').PropType<T[K]>;
|
|
31
|
+
required: true;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
type __VLS_WithTemplateSlots<T, S> = T & {
|
|
35
|
+
new (): {
|
|
36
|
+
$slots: S;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
/**
|
|
3
|
+
* Model value for v-model. A 'number' field emits numbers and never emits an empty value:
|
|
4
|
+
* clearing it leaves the last number in place until a new one is typed.
|
|
5
|
+
*/
|
|
6
|
+
modelValue: string | number | null;
|
|
7
|
+
/** Label on the left */
|
|
8
|
+
label?: string;
|
|
9
|
+
/** Name and id for the input, tying the label to it */
|
|
10
|
+
name?: string;
|
|
11
|
+
/** 'text' (default) or 'number' */
|
|
12
|
+
type?: 'text' | 'number';
|
|
13
|
+
/** Unit or short hint shown inside the field, after the value */
|
|
14
|
+
suffix?: string;
|
|
15
|
+
/** Placeholder shown while the field is empty */
|
|
16
|
+
placeholder?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Take focus when the field appears. The attribute is what a dialog opening around the field
|
|
19
|
+
* honours, and the call below covers a field mounted into something already on screen.
|
|
20
|
+
*/
|
|
21
|
+
autofocus?: boolean;
|
|
22
|
+
/** Disable the field */
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
/** light or dark theme */
|
|
25
|
+
theme?: 'light' | 'dark';
|
|
26
|
+
/** Control height (default '30px') */
|
|
27
|
+
height?: string;
|
|
28
|
+
/** Control width (default fits the content) */
|
|
29
|
+
width?: string;
|
|
30
|
+
/** Optional info tooltip shown via an info icon next to the control. */
|
|
31
|
+
infoTooltip?: string;
|
|
32
|
+
/** Bounds and increment, forwarded to a number input */
|
|
33
|
+
min?: number;
|
|
34
|
+
max?: number;
|
|
35
|
+
step?: number;
|
|
36
|
+
/** Error messages, used to give feedback from validators */
|
|
37
|
+
errorMessages?: string[];
|
|
38
|
+
};
|
|
39
|
+
declare function __VLS_template(): {
|
|
40
|
+
attrs: Partial<{}>;
|
|
41
|
+
slots: {
|
|
42
|
+
insetElement?(_: {}): any;
|
|
43
|
+
};
|
|
44
|
+
refs: {
|
|
45
|
+
inputRef: HTMLInputElement;
|
|
46
|
+
};
|
|
47
|
+
rootEl: HTMLDivElement;
|
|
48
|
+
};
|
|
49
|
+
type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
|
|
50
|
+
declare const __VLS_component: import('vue').DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, unknown, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
51
|
+
"update:modelValue": (value: string | number | null) => void;
|
|
52
|
+
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>> & {
|
|
53
|
+
"onUpdate:modelValue"?: ((value: string | number | null) => any) | undefined;
|
|
54
|
+
}, {}, {}>;
|
|
55
|
+
declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
|
|
56
|
+
export default _default;
|
|
57
|
+
type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
|
|
58
|
+
type __VLS_TypePropsToOption<T> = {
|
|
59
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
60
|
+
type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
|
|
61
|
+
} : {
|
|
62
|
+
type: import('vue').PropType<T[K]>;
|
|
63
|
+
required: true;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
type __VLS_WithTemplateSlots<T, S> = T & {
|
|
67
|
+
new (): {
|
|
68
|
+
$slots: S;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A blocking overlay for an operation that is under way, such as a vehicle restarting. It is up
|
|
3
|
+
* for exactly as long as `modelValue` says it is, and unless it is dismissible there is no way
|
|
4
|
+
* out of it.
|
|
5
|
+
*/
|
|
6
|
+
type __VLS_Props = {
|
|
7
|
+
modelValue: boolean;
|
|
8
|
+
/** What the operation is, shown under the propeller. */
|
|
9
|
+
message?: string;
|
|
10
|
+
/** Offers a close button and lets Escape through, for a wait the user may walk away from. */
|
|
11
|
+
dismissible?: boolean;
|
|
12
|
+
};
|
|
13
|
+
declare const _default: import('vue').DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, unknown, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
14
|
+
"update:modelValue": (value: boolean) => void;
|
|
15
|
+
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>> & {
|
|
16
|
+
"onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
|
|
17
|
+
}, {}, {}>;
|
|
18
|
+
export default _default;
|
|
19
|
+
type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
|
|
20
|
+
type __VLS_TypePropsToOption<T> = {
|
|
21
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
22
|
+
type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
|
|
23
|
+
} : {
|
|
24
|
+
type: import('vue').PropType<T[K]>;
|
|
25
|
+
required: true;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A dropdown of actions, opened either from the activator slot or, with `target`, at a pointer
|
|
3
|
+
* position, which is what a right-click or a long press wants. Pass `target` to place it at a
|
|
4
|
+
* point; leave it out and the activator slot decides where it hangs.
|
|
5
|
+
*/
|
|
6
|
+
export interface BlueMenuItem {
|
|
7
|
+
title: string;
|
|
8
|
+
icon: string;
|
|
9
|
+
/** Renders in the warning colour, for the items that remove something. */
|
|
10
|
+
danger?: boolean;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
/** Shown on hover, to say why an item is disabled. */
|
|
13
|
+
hint?: string;
|
|
14
|
+
action: () => void;
|
|
15
|
+
}
|
|
16
|
+
type __VLS_Props = {
|
|
17
|
+
modelValue: boolean;
|
|
18
|
+
items: BlueMenuItem[];
|
|
19
|
+
target?: [number, number];
|
|
20
|
+
};
|
|
21
|
+
declare function __VLS_template(): {
|
|
22
|
+
attrs: Partial<{}>;
|
|
23
|
+
slots: {
|
|
24
|
+
activator?(_: {
|
|
25
|
+
props: {
|
|
26
|
+
popovertarget: string;
|
|
27
|
+
};
|
|
28
|
+
}): any;
|
|
29
|
+
};
|
|
30
|
+
refs: {
|
|
31
|
+
anchorRef: HTMLSpanElement;
|
|
32
|
+
popoverRef: HTMLDivElement;
|
|
33
|
+
};
|
|
34
|
+
rootEl: any;
|
|
35
|
+
};
|
|
36
|
+
type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
|
|
37
|
+
declare const __VLS_component: import('vue').DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, unknown, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
38
|
+
"update:modelValue": (value: boolean) => void;
|
|
39
|
+
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>> & {
|
|
40
|
+
"onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
|
|
41
|
+
}, {}, {}>;
|
|
42
|
+
declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
|
|
43
|
+
export default _default;
|
|
44
|
+
type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
|
|
45
|
+
type __VLS_TypePropsToOption<T> = {
|
|
46
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
47
|
+
type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
|
|
48
|
+
} : {
|
|
49
|
+
type: import('vue').PropType<T[K]>;
|
|
50
|
+
required: true;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
type __VLS_WithTemplateSlots<T, S> = T & {
|
|
54
|
+
new (): {
|
|
55
|
+
$slots: S;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asks for a name, and optionally a note to go with it: icon and title over a subtitle, the
|
|
3
|
+
* fields in their own section, then a footer whose middle explains what the buttons will do.
|
|
4
|
+
*/
|
|
5
|
+
type __VLS_Props = {
|
|
6
|
+
modelValue: boolean;
|
|
7
|
+
title: string;
|
|
8
|
+
/** Field label for the name. */
|
|
9
|
+
label: string;
|
|
10
|
+
icon?: string;
|
|
11
|
+
/** Explains what the name will be attached to. */
|
|
12
|
+
subtitle?: string;
|
|
13
|
+
initial?: string;
|
|
14
|
+
/** When given, a second optional field is shown and its value comes back with the name. */
|
|
15
|
+
notesLabel?: string;
|
|
16
|
+
notesInitial?: string;
|
|
17
|
+
confirmLabel?: string;
|
|
18
|
+
/** Footer text, for anything worth saying about the outcome rather than the input. */
|
|
19
|
+
hint?: string;
|
|
20
|
+
};
|
|
21
|
+
declare const _default: import('vue').DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, unknown, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
22
|
+
"update:modelValue": (value: boolean) => void;
|
|
23
|
+
confirm: (name: string, notes: string) => void;
|
|
24
|
+
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>> & {
|
|
25
|
+
"onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
|
|
26
|
+
onConfirm?: ((name: string, notes: string) => any) | undefined;
|
|
27
|
+
}, {}, {}>;
|
|
28
|
+
export default _default;
|
|
29
|
+
type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
|
|
30
|
+
type __VLS_TypePropsToOption<T> = {
|
|
31
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
32
|
+
type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
|
|
33
|
+
} : {
|
|
34
|
+
type: import('vue').PropType<T[K]>;
|
|
35
|
+
required: true;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Option in the select
|
|
3
|
+
*/
|
|
4
|
+
interface OptionItem {
|
|
5
|
+
/**
|
|
6
|
+
* Name of the option to display
|
|
7
|
+
*/
|
|
8
|
+
name: string;
|
|
9
|
+
/**
|
|
10
|
+
* Value of the option, if not provided, name will be used
|
|
11
|
+
*/
|
|
12
|
+
value?: any;
|
|
13
|
+
/**
|
|
14
|
+
* Whether the option is disabled
|
|
15
|
+
*/
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Callback when the option is selected
|
|
19
|
+
*/
|
|
20
|
+
onSelected?: () => void;
|
|
21
|
+
}
|
|
22
|
+
type __VLS_Props = {
|
|
23
|
+
/** Options to select from */
|
|
24
|
+
items: OptionItem[];
|
|
25
|
+
/** Disable entire select */
|
|
26
|
+
disabled?: boolean;
|
|
27
|
+
/** light or dark theme */
|
|
28
|
+
theme?: 'light' | 'dark';
|
|
29
|
+
/** Label on the left */
|
|
30
|
+
label?: string;
|
|
31
|
+
/** Optional info tooltip shown via an info icon next to the control. */
|
|
32
|
+
infoTooltip?: string;
|
|
33
|
+
/** Control height */
|
|
34
|
+
height?: string;
|
|
35
|
+
/** Control width */
|
|
36
|
+
width?: string;
|
|
37
|
+
/** Multiple values selection */
|
|
38
|
+
multiSelect?: boolean;
|
|
39
|
+
/** Model value for v-model */
|
|
40
|
+
modelValue?: any;
|
|
41
|
+
/** Error messages, used to give feedback from validators */
|
|
42
|
+
errorMessages?: string[];
|
|
43
|
+
};
|
|
44
|
+
declare function __VLS_template(): {
|
|
45
|
+
attrs: Partial<{}>;
|
|
46
|
+
slots: {
|
|
47
|
+
insetElement?(_: {}): any;
|
|
48
|
+
};
|
|
49
|
+
refs: {
|
|
50
|
+
anchorRef: HTMLButtonElement;
|
|
51
|
+
popoverRef: HTMLDivElement;
|
|
52
|
+
};
|
|
53
|
+
rootEl: HTMLDivElement;
|
|
54
|
+
};
|
|
55
|
+
type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
|
|
56
|
+
declare const __VLS_component: import('vue').DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, unknown, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
57
|
+
"update:modelValue": (value: string | number | (string | number)[]) => void;
|
|
58
|
+
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>> & {
|
|
59
|
+
"onUpdate:modelValue"?: ((value: string | number | (string | number)[]) => any) | undefined;
|
|
60
|
+
}, {}, {}>;
|
|
61
|
+
declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
|
|
62
|
+
export default _default;
|
|
63
|
+
type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
|
|
64
|
+
type __VLS_TypePropsToOption<T> = {
|
|
65
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
66
|
+
type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
|
|
67
|
+
} : {
|
|
68
|
+
type: import('vue').PropType<T[K]>;
|
|
69
|
+
required: true;
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
type __VLS_WithTemplateSlots<T, S> = T & {
|
|
73
|
+
new (): {
|
|
74
|
+
$slots: S;
|
|
75
|
+
};
|
|
76
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
/** Pill color override. */
|
|
3
|
+
color?: string;
|
|
4
|
+
/** Disable user interaction. Add disabled visual feedback */
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
/** Slider height (default. '30px'). */
|
|
7
|
+
height?: string;
|
|
8
|
+
/** Main Label text on the left. */
|
|
9
|
+
label?: string;
|
|
10
|
+
/** Custom text for the max label. */
|
|
11
|
+
labelMax?: string;
|
|
12
|
+
/** Custom text for the min label. */
|
|
13
|
+
labelMin?: string;
|
|
14
|
+
/** Maximum allowed value. */
|
|
15
|
+
max: number;
|
|
16
|
+
/** Minimum allowed value. */
|
|
17
|
+
min: number;
|
|
18
|
+
/** Name attribute for the range input. */
|
|
19
|
+
name: string;
|
|
20
|
+
/** Step increment (default 1). */
|
|
21
|
+
step?: number;
|
|
22
|
+
/** Keyboard arrow step multiplier (default 3). */
|
|
23
|
+
keyboardStepMultiplierLimit?: number;
|
|
24
|
+
/** 'light' or 'dark' theme. (default 'light')*/
|
|
25
|
+
theme?: 'light' | 'dark' | 'transparent';
|
|
26
|
+
/** Container width (default '100%'). */
|
|
27
|
+
width?: string;
|
|
28
|
+
/** Model value for v-model */
|
|
29
|
+
modelValue: number | null;
|
|
30
|
+
/** Function to scale the internal percentage value to a display value */
|
|
31
|
+
scaleFn?: (raw: number) => number;
|
|
32
|
+
/** Function to unscale the displayed value to the internal percentage value */
|
|
33
|
+
unscaleFn?: (scaled: number) => number;
|
|
34
|
+
/** Function format scaled values, converting them to strings */
|
|
35
|
+
formatDisplay?: (scaled: number) => string;
|
|
36
|
+
};
|
|
37
|
+
declare const _default: import('vue').DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, unknown, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
38
|
+
"update:modelValue": (value: number | null) => void;
|
|
39
|
+
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>> & {
|
|
40
|
+
"onUpdate:modelValue"?: ((value: number | null) => any) | undefined;
|
|
41
|
+
}, {}, {}>;
|
|
42
|
+
export default _default;
|
|
43
|
+
type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
|
|
44
|
+
type __VLS_TypePropsToOption<T> = {
|
|
45
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
46
|
+
type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
|
|
47
|
+
} : {
|
|
48
|
+
type: import('vue').PropType<T[K]>;
|
|
49
|
+
required: true;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
/** Color of the switch's knob when it is on. */
|
|
3
|
+
color?: string;
|
|
4
|
+
/** The current value of the switch. */
|
|
5
|
+
modelValue: boolean | null;
|
|
6
|
+
/** Whether the switch is disabled. */
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
/** Height of the switch container. */
|
|
9
|
+
height?: string;
|
|
10
|
+
/** Label on the left side of the component. */
|
|
11
|
+
label?: string;
|
|
12
|
+
/** Optional info tooltip shown via an info icon next to the control. */
|
|
13
|
+
infoTooltip?: string;
|
|
14
|
+
/** Custom text for the switch when it is on. */
|
|
15
|
+
labelOn?: string;
|
|
16
|
+
/** Custom text for the switch when it is off. */
|
|
17
|
+
labelOff?: string;
|
|
18
|
+
/** Name of the component's container. */
|
|
19
|
+
name: string;
|
|
20
|
+
/** Theme of the component. */
|
|
21
|
+
theme?: 'light' | 'dark';
|
|
22
|
+
/** Minimum width of the container. */
|
|
23
|
+
width?: string;
|
|
24
|
+
};
|
|
25
|
+
declare const _default: import('vue').DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, unknown, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
26
|
+
"update:modelValue": (value: boolean) => void;
|
|
27
|
+
}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>> & {
|
|
28
|
+
"onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
|
|
29
|
+
}, {}, {}>;
|
|
30
|
+
export default _default;
|
|
31
|
+
type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
|
|
32
|
+
type __VLS_TypePropsToOption<T> = {
|
|
33
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? {
|
|
34
|
+
type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
|
|
35
|
+
} : {
|
|
36
|
+
type: import('vue').PropType<T[K]>;
|
|
37
|
+
required: true;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Placement } from '@floating-ui/vue';
|
|
2
|
+
import { CSSProperties, Ref } from 'vue';
|
|
3
|
+
interface BluePopoverOptions {
|
|
4
|
+
/** Where the menu hangs off its anchor (default 'bottom-end'). */
|
|
5
|
+
placement?: Placement;
|
|
6
|
+
/** Give the menu at least its anchor's width, for a select whose list should line up with it. */
|
|
7
|
+
matchAnchorWidth?: boolean;
|
|
8
|
+
}
|
|
9
|
+
interface BluePopover {
|
|
10
|
+
/** Goes on the element the menu hangs off, when it opens from a control rather than a pointer. */
|
|
11
|
+
anchorRef: Ref<HTMLElement | null>;
|
|
12
|
+
/** Goes on the element carrying the `popover` attribute. */
|
|
13
|
+
popoverRef: Ref<HTMLElement | null>;
|
|
14
|
+
/** The popover's id, for the `popovertarget` the activator is bound to. */
|
|
15
|
+
popoverId: string;
|
|
16
|
+
/** Bind onto an activator `<button>` to let the browser own the open and close. */
|
|
17
|
+
activatorProps: {
|
|
18
|
+
popovertarget: string;
|
|
19
|
+
};
|
|
20
|
+
isOpen: Ref<boolean>;
|
|
21
|
+
/** False until the menu has been placed, so it can be held invisible for that first frame. */
|
|
22
|
+
isPositioned: Readonly<Ref<boolean>>;
|
|
23
|
+
floatingStyles: Readonly<Ref<CSSProperties>>;
|
|
24
|
+
/** Opens the menu, at a viewport position when one is given instead of an anchor element. */
|
|
25
|
+
show: (pointerTarget?: [number, number]) => Promise<void>;
|
|
26
|
+
hide: () => void;
|
|
27
|
+
/** Bind to the popover's `toggle` event, so a dismissal by the browser is reflected back. */
|
|
28
|
+
onToggle: (event: Event) => void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A menu that opens in the top layer, so it is never clipped by the panel it belongs to and
|
|
32
|
+
* needs no z-index of its own. The native popover dismisses it on outside click and on Escape;
|
|
33
|
+
* floating-ui keeps it beside its anchor and inside the viewport.
|
|
34
|
+
* @param {BluePopoverOptions} options Placement, and whether to match the anchor's width.
|
|
35
|
+
* @returns {BluePopover} Refs to bind, open state, and imperative open and close.
|
|
36
|
+
*/
|
|
37
|
+
export declare function useBluePopover(options?: BluePopoverOptions): BluePopover;
|
|
38
|
+
export {};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { default as BlueButtonGroup } from './components/BlueButtonGroup.vue';
|
|
2
|
+
export { default as BlueExpansiblePanel } from './components/BlueExpansiblePanel.vue';
|
|
3
|
+
export { default as BlueInput } from './components/BlueInput.vue';
|
|
4
|
+
export { default as BlueLoadingDialog } from './components/BlueLoadingDialog.vue';
|
|
5
|
+
export { default as BlueMenu, type BlueMenuItem } from './components/BlueMenu.vue';
|
|
6
|
+
export { default as BluePromptDialog } from './components/BluePromptDialog.vue';
|
|
7
|
+
export { default as BlueSelect } from './components/BlueSelect.vue';
|
|
8
|
+
export { default as BlueSlider } from './components/BlueSlider.vue';
|
|
9
|
+
export { default as BlueSwitch } from './components/BlueSwitch.vue';
|
|
10
|
+
export { useBluePopover } from './composables/useBluePopover';
|
package/dist/style.css
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-duration:initial;--tw-ease:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--color-gray-100:oklch(96.7% .003 264.542);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-700:oklch(37.3% .034 259.733);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--font-weight-medium:500;--font-weight-bold:700;--tracking-wide:.025em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-lg:.5rem;--ease-out:cubic-bezier(0,0,.2,1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1)}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-\[18\%\]{inset-inline:18%}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing)*3)}.top-\[4px\]{top:4px}.right-0{right:calc(var(--spacing)*0)}.right-3{right:calc(var(--spacing)*3)}.right-\[5px\]{right:5px}.bottom-1\/2{bottom:50%}.bottom-\[4px\]{bottom:4px}.bottom-full{bottom:100%}.left-1\/2{left:50%}.left-\[-20px\]{left:-20px}.left-\[5px\]{left:5px}.z-10{z-index:10}.z-50{z-index:50}.z-\[20\]{z-index:20}.z-\[666\]{z-index:666}.z-\[1000\]{z-index:1000}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing)*2)}.my-6{margin-block:calc(var(--spacing)*6)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-\[2px\]{margin-top:2px}.mt-\[15px\]{margin-top:15px}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-6{margin-right:calc(var(--spacing)*6)}.mr-\[2px\]{margin-right:2px}.mr-\[3px\]{margin-right:3px}.-mb-\[1px\]{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-2{height:calc(var(--spacing)*2)}.h-3\/4{height:75%}.h-7{height:calc(var(--spacing)*7)}.h-\[100px\]{height:100px}.h-full{height:100%}.h-px{height:1px}.max-h-\[60vh\]{max-height:60vh}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing)*2)}.w-\[1px\]{width:1px}.w-\[6px\]{width:6px}.w-\[100px\]{width:100px}.w-\[320px\]{width:320px}.w-\[624px\]{width:624px}.w-\[760px\]{width:760px}.w-\[calc\(50\%-4px\)\]{width:calc(50% - 4px)}.w-full{width:100%}.w-max{width:max-content}.max-w-\[45\%\]{max-width:45%}.max-w-\[150px\]{max-width:150px}.max-w-\[280px\]{max-width:280px}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[30px\]{min-width:30px}.min-w-\[60px\]{min-width:60px}.min-w-\[90px\]{min-width:90px}.min-w-\[140px\]{min-width:140px}.min-w-\[220px\]{min-width:220px}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.shrink-\[1000\]{flex-shrink:1000}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-1\/2{--tw-translate-y:calc(1/2*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[0\.22em\]{--tw-translate-y:.22em;translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-5{gap:calc(var(--spacing)*5)}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[4px\]{border-radius:4px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\]{border-radius:8px}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1px\]{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-solid{--tw-border-style:solid;border-style:solid}.border-\[\#555555\]{border-color:#555}.border-\[\#FFFFFF22\]{border-color:#fff2}.border-\[\#dddddd\]{border-color:#ddd}.border-\[\#ffffff0d\]{border-color:#ffffff0d}.border-\[\#ffffff1a\]{border-color:#ffffff1a}.border-\[var\(--bluevue-error\)\]{border-color:var(--bluevue-error)}.border-gray-300{border-color:var(--color-gray-300)}.border-white{border-color:var(--color-white)}.bg-\[\#2d2d2d\]{background-color:#2d2d2d}.bg-\[\#00000011\]{background-color:#0001}.bg-\[\#00000033\]{background-color:#0003}.bg-\[\#6699cc\]{background-color:#69c}.bg-\[\#132029\]{background-color:#132029}.bg-\[\#464646AA\]{background-color:#464646aa}.bg-\[\#FFFFFF22\]{background-color:#fff2}.bg-\[\#ffffff0d\]{background-color:#ffffff0d}.bg-\[\#ffffff11\]{background-color:#fff1}.bg-\[\#ffffff22\]{background-color:#fff2}.bg-\[var\(--bluevue-primary\)\]{background-color:var(--bluevue-primary)}.bg-\[var\(--bluevue-surface\)\]{background-color:var(--bluevue-surface)}.bg-gray-700{background-color:var(--color-gray-700)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.p-6{padding:calc(var(--spacing)*6)}.px-0{padding-inline:calc(var(--spacing)*0)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-13{padding-inline:calc(var(--spacing)*13)}.px-\[6px\]{padding-inline:6px}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-7{padding-top:calc(var(--spacing)*7)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-4{padding-right:calc(var(--spacing)*4)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-5{padding-bottom:calc(var(--spacing)*5)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-4{padding-left:calc(var(--spacing)*4)}.text-center{text-align:center}.text-left{text-align:left}.text-start{text-align:start}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[16px\]{font-size:16px}.text-\[18px\]{font-size:18px}.text-\[20px\]{font-size:20px}.text-\[22px\]{font-size:22px}.text-\[24px\]{font-size:24px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.whitespace-nowrap{white-space:nowrap}.text-\[\#42A5F5\]{color:#42a5f5}.text-\[\#00000066\]{color:#0006}.text-\[\#FFFFFF99\]{color:#fff9}.text-\[\#ff6b6b\]{color:#ff6b6b}.text-\[\#ffffff44\]{color:#fff4}.text-\[\#ffffff66\]{color:#fff6}.text-\[\#ffffff88\]{color:#fff8}.text-\[\#ffffff99\]{color:#fff9}.text-\[\#ffffffaa\]{color:#fffa}.text-\[var\(--bluevue-error\)\]{color:var(--bluevue-error)}.text-black{color:var(--color-black)}.text-gray-500{color:var(--color-gray-500)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:block:is(:where(.group):hover *){display:block}}.placeholder\:text-\[\#00000055\]::placeholder{color:#0005}.placeholder\:text-\[\#ffffff44\]::placeholder{color:#fff4}@media (hover:hover){.hover\:bg-\[\#333333\]:hover{background-color:#333}.hover\:bg-\[\#ffffff11\]:hover{background-color:#fff1}.hover\:bg-\[\#ffffff22\]:hover{background-color:#fff2}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:text-white:hover{color:var(--color-white)}.hover\:brightness-125:hover{--tw-brightness:brightness(125%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-\[\#9e9e9e80\]:disabled{background-color:#9e9e9e80}.disabled\:text-\[\#afafaf\]:disabled{color:#afafaf}.disabled\:opacity-30:disabled{opacity:.3}@media (hover:hover){.disabled\:hover\:brightness-100:disabled:hover{--tw-brightness:brightness(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}}:root{--bluevue-primary:#0b5087;--bluevue-error:#cf6679;--bluevue-surface:#363636;--bluevue-accent:#69c;--bluevue-panel-bg:#1e1e1ef5;--bluevue-hairline:#ffffff14;--bluevue-elevation-1:0 2px 1px -1px #0003,0 1px 1px 0 #00000024,0 1px 3px 0 #0000001f;--bluevue-elevation-5:0 3px 5px -1px #0003,0 5px 8px 0 #00000024,0 1px 14px 0 #0000001f;--bluevue-inset-1:inset 0 1px 2px #00000056,inset 0 .5px .5px #0000003a,inset 0 -.5px 0 #ffffff0b}.bluevue-elevation-1{box-shadow:var(--bluevue-elevation-1)}.bluevue-elevation-5{box-shadow:var(--bluevue-elevation-5)}.bluevue-inset-1{box-shadow:var(--bluevue-inset-1)}.bluevue-panel{background-color:var(--bluevue-panel-bg);-webkit-backdrop-filter:blur(8px);border:1px solid var(--bluevue-hairline);box-shadow:0 4px 4px #0003,0 8px 12px 6px #00000026}.bluevue-dialog{background:0 0;border:none;max-width:min(92vw,624px);max-height:92vh;margin:auto;padding:0;overflow:visible}.bluevue-dialog:focus,.bluevue-dialog:focus-visible,.bluevue-popover:focus,.bluevue-popover:focus-visible{outline:none}.bluevue-dialog::backdrop{-webkit-backdrop-filter:blur(8px);background:#000000e0}.bluevue-popover{background:0 0;border:none;margin:0;padding:0;position:fixed;overflow:visible}.bluevue-expand-enter-active,.bluevue-expand-leave-active{transition:max-height .3s;overflow:hidden}.bluevue-expand-enter-from,.bluevue-expand-leave-to{max-height:0}.bluevue-expand-enter-to,.bluevue-expand-leave-from{max-height:500px}.bluevue-loading__icon{animation:4s infinite bluevue-prop}@keyframes bluevue-prop{0%{animation-timing-function:cubic-bezier(.45,0,.55,1);transform:rotate(0)}50%{animation-timing-function:cubic-bezier(.35,0,.45,1);transform:rotate(80deg)}to{transform:rotate(1440deg)}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bluerobotics/bluevue",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Blue Robotics Vue components for common UI",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/bluerobotics/BlueVue.git"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/bluerobotics/BlueVue#readme",
|
|
11
|
+
"keywords": [
|
|
12
|
+
"vue",
|
|
13
|
+
"components",
|
|
14
|
+
"blueos",
|
|
15
|
+
"blue-robotics",
|
|
16
|
+
"tailwind"
|
|
17
|
+
],
|
|
18
|
+
"type": "module",
|
|
19
|
+
"sideEffects": [
|
|
20
|
+
"*.css"
|
|
21
|
+
],
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"src"
|
|
25
|
+
],
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"import": "./dist/bluevue.js"
|
|
30
|
+
},
|
|
31
|
+
"./style.css": "./dist/style.css",
|
|
32
|
+
"./bluevue.css": "./src/styles/bluevue.css"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"dev": "vite",
|
|
36
|
+
"build": "npm run typecheck && vite build && npm run build:css",
|
|
37
|
+
"build:css": "tailwindcss --input src/styles/bundled.css --output dist/style.css --minify",
|
|
38
|
+
"typecheck": "vue-tsc --noEmit",
|
|
39
|
+
"lint": "eslint . --ext .vue,.ts",
|
|
40
|
+
"prepublishOnly": "npm run build"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@floating-ui/vue": "2.0.1"
|
|
44
|
+
},
|
|
45
|
+
"peerDependencies": {
|
|
46
|
+
"@mdi/font": ">=7",
|
|
47
|
+
"vue": "^3.4"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@tailwindcss/cli": "4.1.11",
|
|
51
|
+
"@tailwindcss/vite": "4.1.11",
|
|
52
|
+
"@typescript-eslint/eslint-plugin": "7.18.0",
|
|
53
|
+
"@typescript-eslint/parser": "7.18.0",
|
|
54
|
+
"@vitejs/plugin-vue": "5.1.3",
|
|
55
|
+
"eslint": "8.57.0",
|
|
56
|
+
"eslint-plugin-vue": "9.27.0",
|
|
57
|
+
"tailwindcss": "4.1.11",
|
|
58
|
+
"typescript": "5.5.4",
|
|
59
|
+
"vite": "5.4.2",
|
|
60
|
+
"vite-plugin-dts": "4.5.4",
|
|
61
|
+
"vue": "3.4.38",
|
|
62
|
+
"vue-tsc": "2.0.29"
|
|
63
|
+
}
|
|
64
|
+
}
|