wilday_ui 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/builds/wilday_ui/index.js +237 -0
- data/app/assets/builds/wilday_ui/index.js.map +3 -3
- data/app/assets/stylesheets/wilday_ui/components/button/features/tooltip.css +258 -0
- data/app/assets/stylesheets/wilday_ui/components/button/index.css +1 -0
- data/app/helpers/wilday_ui/application_helper.rb +0 -1
- data/app/helpers/wilday_ui/components/button_helper.rb +135 -2
- data/app/javascript/wilday_ui/controllers/index.js +2 -0
- data/app/javascript/wilday_ui/controllers/tooltip_controller.js +318 -0
- data/lib/wilday_ui/version.rb +1 -1
- metadata +4 -3
- data/app/helpers/wilday_ui/theme_helper.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6aae81001c80b4c0fd86eaca5391e6de697a87b88e38215bd1889a70163dafe7
|
4
|
+
data.tar.gz: 87cff2dba0f7408ae84456cec4b6aac1927f1bcc27ad09309091c2b43c3df45a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '09d8ec007fb7c0757f65ded7d2e059281752c2fdc07cee90aea77dc82b008adb9e07c6161cd527635ceb289121a030b29234a6d5c306a24e68b3d9378e0bfc0e'
|
7
|
+
data.tar.gz: da49ca71e648b9e527d02668a83cc6130dcb53ada46f195e9bb19dc4e3a5cf716b9d0b7353f4e68cfdc01416c6bdc5b8a15afc8ea349ea9fe8053be3c74bf318
|
@@ -2929,6 +2929,242 @@ var confirmation_controller_default = class extends Controller {
|
|
2929
2929
|
}
|
2930
2930
|
};
|
2931
2931
|
|
2932
|
+
// app/javascript/wilday_ui/controllers/tooltip_controller.js
|
2933
|
+
var tooltip_controller_default = class extends Controller {
|
2934
|
+
static targets = ["trigger"];
|
2935
|
+
static values = {
|
2936
|
+
content: String,
|
2937
|
+
position: { type: String, default: "top" },
|
2938
|
+
align: { type: String, default: "center" },
|
2939
|
+
trigger: { type: String, default: "hover" },
|
2940
|
+
showDelay: { type: Number, default: 0 },
|
2941
|
+
hideDelay: { type: Number, default: 0 },
|
2942
|
+
offset: { type: Number, default: 8 },
|
2943
|
+
theme: { type: String, default: "light" },
|
2944
|
+
size: { type: String, default: "md" },
|
2945
|
+
arrow: { type: Boolean, default: false },
|
2946
|
+
customStyle: String
|
2947
|
+
};
|
2948
|
+
connect() {
|
2949
|
+
this.tooltipElement = null;
|
2950
|
+
this.showTimeoutId = null;
|
2951
|
+
this.hideTimeoutId = null;
|
2952
|
+
this.setupTooltip();
|
2953
|
+
this.scrollHandler = () => {
|
2954
|
+
if (this.tooltipElement.style.display !== "none") {
|
2955
|
+
const triggerRect = this.triggerTarget.getBoundingClientRect();
|
2956
|
+
const isInViewport = triggerRect.top >= 0 && triggerRect.left >= 0 && triggerRect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && triggerRect.right <= (window.innerWidth || document.documentElement.clientWidth);
|
2957
|
+
if (isInViewport) {
|
2958
|
+
this.position();
|
2959
|
+
} else {
|
2960
|
+
this.hide();
|
2961
|
+
}
|
2962
|
+
}
|
2963
|
+
};
|
2964
|
+
window.addEventListener("scroll", this.scrollHandler);
|
2965
|
+
}
|
2966
|
+
disconnect() {
|
2967
|
+
if (this.clickOutsideHandler) {
|
2968
|
+
document.removeEventListener("click", this.clickOutsideHandler);
|
2969
|
+
}
|
2970
|
+
window.removeEventListener("scroll", this.scrollHandler);
|
2971
|
+
this.removeTooltip();
|
2972
|
+
}
|
2973
|
+
setupTooltip() {
|
2974
|
+
this.tooltipElement = this.createTooltipElement();
|
2975
|
+
document.body.appendChild(this.tooltipElement);
|
2976
|
+
if (this.triggerValue === "hover") {
|
2977
|
+
this.triggerTarget.addEventListener("mouseenter", () => this.show());
|
2978
|
+
this.triggerTarget.addEventListener("mouseleave", () => this.hide());
|
2979
|
+
this.triggerTarget.addEventListener("focusin", () => this.show());
|
2980
|
+
this.triggerTarget.addEventListener("focusout", () => this.hide());
|
2981
|
+
} else if (this.triggerValue === "click") {
|
2982
|
+
const hasDropdown = this.element.hasAttribute("data-controller") && this.element.getAttribute("data-controller").includes("dropdown");
|
2983
|
+
const hasClipboard = this.element.hasAttribute("data-controller") && this.element.getAttribute("data-controller").includes("clipboard");
|
2984
|
+
if (hasDropdown || hasClipboard) {
|
2985
|
+
this.triggerTarget.addEventListener("mouseenter", () => this.show());
|
2986
|
+
this.triggerTarget.addEventListener("mouseleave", () => this.hide());
|
2987
|
+
} else {
|
2988
|
+
this.triggerTarget.addEventListener("click", (e) => {
|
2989
|
+
e.stopPropagation();
|
2990
|
+
this.toggle();
|
2991
|
+
});
|
2992
|
+
this.clickOutsideHandler = (e) => {
|
2993
|
+
if (!this.triggerTarget.contains(e.target) && !this.tooltipElement.contains(e.target)) {
|
2994
|
+
this.hide();
|
2995
|
+
}
|
2996
|
+
};
|
2997
|
+
document.addEventListener("click", this.clickOutsideHandler);
|
2998
|
+
}
|
2999
|
+
}
|
3000
|
+
}
|
3001
|
+
createTooltipElement() {
|
3002
|
+
const tooltip = document.createElement("div");
|
3003
|
+
tooltip.id = this.triggerTarget.getAttribute("aria-describedby");
|
3004
|
+
tooltip.className = `w-tooltip w-tooltip-${this.themeValue} w-tooltip-size-${this.sizeValue}`;
|
3005
|
+
if (this.arrowValue) tooltip.classList.add("w-tooltip-arrow");
|
3006
|
+
tooltip.setAttribute("role", "tooltip");
|
3007
|
+
tooltip.setAttribute("data-position", this.positionValue);
|
3008
|
+
tooltip.setAttribute("data-align", this.alignValue);
|
3009
|
+
tooltip.innerHTML = this.contentValue;
|
3010
|
+
if (this.hasCustomStyleValue && this.customStyleValue) {
|
3011
|
+
tooltip.style.cssText += this.customStyleValue;
|
3012
|
+
}
|
3013
|
+
tooltip.style.display = "none";
|
3014
|
+
return tooltip;
|
3015
|
+
}
|
3016
|
+
show() {
|
3017
|
+
clearTimeout(this.hideTimeoutId);
|
3018
|
+
this.showTimeoutId = setTimeout(() => {
|
3019
|
+
this.tooltipElement.style.transform = "none";
|
3020
|
+
this.tooltipElement.style.visibility = "hidden";
|
3021
|
+
this.tooltipElement.style.display = "block";
|
3022
|
+
this.tooltipElement.offsetHeight;
|
3023
|
+
this.position();
|
3024
|
+
this.tooltipElement.style.visibility = "visible";
|
3025
|
+
requestAnimationFrame(() => {
|
3026
|
+
this.tooltipElement.classList.add("w-tooltip-visible");
|
3027
|
+
});
|
3028
|
+
}, this.showDelayValue);
|
3029
|
+
}
|
3030
|
+
hide() {
|
3031
|
+
clearTimeout(this.showTimeoutId);
|
3032
|
+
this.hideTimeoutId = setTimeout(() => {
|
3033
|
+
this.tooltipElement.classList.remove("w-tooltip-visible");
|
3034
|
+
setTimeout(() => {
|
3035
|
+
this.tooltipElement.style.display = "none";
|
3036
|
+
}, 150);
|
3037
|
+
}, this.hideDelayValue);
|
3038
|
+
}
|
3039
|
+
toggle() {
|
3040
|
+
if (this.tooltipElement.style.display === "none") {
|
3041
|
+
this.show();
|
3042
|
+
} else {
|
3043
|
+
this.hide();
|
3044
|
+
}
|
3045
|
+
}
|
3046
|
+
position() {
|
3047
|
+
const triggerRect = this.triggerTarget.getBoundingClientRect();
|
3048
|
+
const tooltipRect = this.tooltipElement.getBoundingClientRect();
|
3049
|
+
const viewportHeight = window.innerHeight;
|
3050
|
+
const viewportWidth = window.innerWidth;
|
3051
|
+
const arrowOffset = this.arrowValue ? 2 : 0;
|
3052
|
+
const scrollX = window.pageXOffset || document.documentElement.scrollLeft;
|
3053
|
+
const scrollY = window.pageYOffset || document.documentElement.scrollTop;
|
3054
|
+
console.log("=== Initial Values ===");
|
3055
|
+
console.log("Viewport Height:", viewportHeight);
|
3056
|
+
console.log("Viewport Width:", viewportWidth);
|
3057
|
+
console.log("Trigger Top:", triggerRect.top);
|
3058
|
+
console.log("Trigger Bottom:", triggerRect.bottom);
|
3059
|
+
console.log("Trigger Left:", triggerRect.left);
|
3060
|
+
console.log("Trigger Right:", triggerRect.right);
|
3061
|
+
console.log("Tooltip Height:", tooltipRect.height);
|
3062
|
+
console.log("Tooltip Width:", tooltipRect.width);
|
3063
|
+
let position = this.positionValue;
|
3064
|
+
let top, left;
|
3065
|
+
const spaceBelow = viewportHeight - triggerRect.bottom;
|
3066
|
+
const spaceAbove = triggerRect.top;
|
3067
|
+
const spaceRight = viewportWidth - triggerRect.right;
|
3068
|
+
const spaceLeft = triggerRect.left;
|
3069
|
+
const requiredSpaceVertical = tooltipRect.height + this.offsetValue + arrowOffset;
|
3070
|
+
const requiredSpaceHorizontal = tooltipRect.width + this.offsetValue + arrowOffset;
|
3071
|
+
console.log("\n=== Space Calculation ===");
|
3072
|
+
console.log("Space Above:", spaceAbove);
|
3073
|
+
console.log("Space Below:", spaceBelow);
|
3074
|
+
console.log("Space Left:", spaceLeft);
|
3075
|
+
console.log("Space Right:", spaceRight);
|
3076
|
+
console.log("Required Space Vertical:", requiredSpaceVertical);
|
3077
|
+
console.log("Required Space Horizontal:", requiredSpaceHorizontal);
|
3078
|
+
if (position === "right" && spaceRight >= requiredSpaceHorizontal) {
|
3079
|
+
position = "right";
|
3080
|
+
console.log("Using right - sufficient space");
|
3081
|
+
} else if (position === "left" && spaceLeft >= requiredSpaceHorizontal) {
|
3082
|
+
position = "left";
|
3083
|
+
console.log("Using left - sufficient space");
|
3084
|
+
} else if (position === "top" && spaceAbove >= requiredSpaceVertical) {
|
3085
|
+
position = "top";
|
3086
|
+
console.log("Using top - sufficient space");
|
3087
|
+
} else if (position === "bottom" && spaceBelow >= requiredSpaceVertical) {
|
3088
|
+
position = "bottom";
|
3089
|
+
console.log("Using bottom - sufficient space");
|
3090
|
+
} else if (spaceBelow >= requiredSpaceVertical) {
|
3091
|
+
position = "bottom";
|
3092
|
+
console.log("Fallback to bottom - sufficient space");
|
3093
|
+
} else {
|
3094
|
+
position = "top";
|
3095
|
+
console.log("Fallback to top - insufficient space below");
|
3096
|
+
}
|
3097
|
+
switch (position) {
|
3098
|
+
case "top":
|
3099
|
+
top = triggerRect.top - tooltipRect.height - this.offsetValue - arrowOffset;
|
3100
|
+
if (this.alignValue === "end") {
|
3101
|
+
left = triggerRect.right - tooltipRect.width;
|
3102
|
+
} else if (this.alignValue === "center") {
|
3103
|
+
left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;
|
3104
|
+
} else {
|
3105
|
+
left = triggerRect.left;
|
3106
|
+
}
|
3107
|
+
break;
|
3108
|
+
case "bottom":
|
3109
|
+
top = triggerRect.bottom + this.offsetValue + arrowOffset;
|
3110
|
+
if (this.alignValue === "end") {
|
3111
|
+
left = triggerRect.right - tooltipRect.width;
|
3112
|
+
} else if (this.alignValue === "center") {
|
3113
|
+
left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;
|
3114
|
+
} else {
|
3115
|
+
left = triggerRect.left;
|
3116
|
+
}
|
3117
|
+
break;
|
3118
|
+
case "left":
|
3119
|
+
left = triggerRect.left - tooltipRect.width - this.offsetValue - arrowOffset;
|
3120
|
+
if (this.alignValue === "end") {
|
3121
|
+
top = triggerRect.bottom - tooltipRect.height;
|
3122
|
+
} else if (this.alignValue === "center") {
|
3123
|
+
top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;
|
3124
|
+
} else {
|
3125
|
+
top = triggerRect.top;
|
3126
|
+
}
|
3127
|
+
break;
|
3128
|
+
case "right":
|
3129
|
+
left = triggerRect.right + this.offsetValue + arrowOffset;
|
3130
|
+
if (this.alignValue === "end") {
|
3131
|
+
top = triggerRect.bottom - tooltipRect.height;
|
3132
|
+
} else if (this.alignValue === "center") {
|
3133
|
+
top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;
|
3134
|
+
} else {
|
3135
|
+
top = triggerRect.top;
|
3136
|
+
}
|
3137
|
+
break;
|
3138
|
+
}
|
3139
|
+
if (top < 0) {
|
3140
|
+
top = this.offsetValue;
|
3141
|
+
} else if (top + tooltipRect.height > viewportHeight) {
|
3142
|
+
top = viewportHeight - tooltipRect.height - this.offsetValue;
|
3143
|
+
}
|
3144
|
+
if (left < 0) {
|
3145
|
+
left = this.offsetValue;
|
3146
|
+
} else if (left + tooltipRect.width > viewportWidth) {
|
3147
|
+
left = viewportWidth - tooltipRect.width - this.offsetValue;
|
3148
|
+
}
|
3149
|
+
console.log("\n=== Final Position ===");
|
3150
|
+
console.log("Position:", position);
|
3151
|
+
console.log("Top:", top);
|
3152
|
+
console.log("Left:", left);
|
3153
|
+
console.log("Alignment:", this.alignValue);
|
3154
|
+
top += scrollY;
|
3155
|
+
left += scrollX;
|
3156
|
+
this.tooltipElement.setAttribute("data-position", position);
|
3157
|
+
this.tooltipElement.style.top = `${top}px`;
|
3158
|
+
this.tooltipElement.style.left = `${left}px`;
|
3159
|
+
}
|
3160
|
+
removeTooltip() {
|
3161
|
+
if (this.tooltipElement) {
|
3162
|
+
this.tooltipElement.remove();
|
3163
|
+
this.tooltipElement = null;
|
3164
|
+
}
|
3165
|
+
}
|
3166
|
+
};
|
3167
|
+
|
2932
3168
|
// app/javascript/wilday_ui/controllers/index.js
|
2933
3169
|
var application = Application.start();
|
2934
3170
|
window.Stimulus = application;
|
@@ -2936,6 +3172,7 @@ application.register("button", ButtonController);
|
|
2936
3172
|
application.register("dropdown", dropdown_controller_default);
|
2937
3173
|
application.register("clipboard", clipboard_controller_default);
|
2938
3174
|
application.register("confirmation", confirmation_controller_default);
|
3175
|
+
application.register("tooltip", tooltip_controller_default);
|
2939
3176
|
|
2940
3177
|
// app/javascript/wilday_ui/components/button.js
|
2941
3178
|
document.addEventListener("DOMContentLoaded", () => {
|