blessing-ui 0.1.0 → 0.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.
Files changed (200) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/README.md +139 -105
  3. package/dist/blessing-ui.css +97 -1
  4. package/dist/components/BlessAnnotator.css +1 -0
  5. package/dist/components/BlessAnnotator.js +6 -0
  6. package/dist/components/BlessAnnotator.vue.d.ts +71 -0
  7. package/dist/components/BlessAnnotator.vue_vue_type_script_setup_true_lang.js +264 -0
  8. package/dist/components/BlessAttachment.vue.d.ts +4 -1
  9. package/dist/components/BlessAttachment.vue_vue_type_script_setup_true_lang.js +3 -2
  10. package/dist/components/BlessCalendar.vue.d.ts +4 -0
  11. package/dist/components/BlessCalendar.vue_vue_type_script_setup_true_lang.js +65 -60
  12. package/dist/components/BlessCarousel.vue.d.ts +3 -0
  13. package/dist/components/BlessCarousel.vue_vue_type_script_setup_true_lang.js +10 -9
  14. package/dist/components/BlessCoachmark.css +1 -0
  15. package/dist/components/BlessCoachmark.js +6 -0
  16. package/dist/components/BlessCoachmark.vue.d.ts +40 -0
  17. package/dist/components/BlessCoachmark.vue_vue_type_script_setup_true_lang.js +74 -0
  18. package/dist/components/BlessCodeBlock.css +1 -0
  19. package/dist/components/BlessCodeBlock.js +6 -0
  20. package/dist/components/BlessCodeBlock.vue.d.ts +72 -0
  21. package/dist/components/BlessCodeBlock.vue_vue_type_script_setup_true_lang.js +140 -0
  22. package/dist/components/BlessCombobox.vue.d.ts +2 -0
  23. package/dist/components/BlessCombobox.vue_vue_type_script_setup_true_lang.js +3 -2
  24. package/dist/components/BlessCommand.css +1 -1
  25. package/dist/components/BlessCommand.vue.d.ts +26 -0
  26. package/dist/components/BlessCommand.vue_vue_type_script_setup_true_lang.js +137 -70
  27. package/dist/components/BlessConfetti.css +1 -0
  28. package/dist/components/BlessConfetti.js +6 -0
  29. package/dist/components/BlessConfetti.vue.d.ts +40 -0
  30. package/dist/components/BlessConfetti.vue_vue_type_script_setup_true_lang.js +77 -0
  31. package/dist/components/BlessCountUp.css +1 -0
  32. package/dist/components/BlessCountUp.js +6 -0
  33. package/dist/components/BlessCountUp.vue.d.ts +18 -0
  34. package/dist/components/BlessCountUp.vue_vue_type_script_setup_true_lang.js +49 -0
  35. package/dist/components/BlessCropper.css +1 -0
  36. package/dist/components/BlessCropper.js +6 -0
  37. package/dist/components/BlessCropper.vue.d.ts +70 -0
  38. package/dist/components/BlessCropper.vue_vue_type_script_setup_true_lang.js +220 -0
  39. package/dist/components/BlessDataTable.vue.d.ts +6 -0
  40. package/dist/components/BlessDataTable.vue_vue_type_script_setup_true_lang.js +56 -42
  41. package/dist/components/BlessDataView.vue.d.ts +7 -0
  42. package/dist/components/BlessDataView.vue_vue_type_script_setup_true_lang.js +38 -31
  43. package/dist/components/BlessDatePicker.vue.d.ts +3 -0
  44. package/dist/components/BlessDatePicker.vue_vue_type_script_setup_true_lang.js +46 -45
  45. package/dist/components/BlessDiff.css +1 -0
  46. package/dist/components/BlessDiff.js +6 -0
  47. package/dist/components/BlessDiff.vue.d.ts +22 -0
  48. package/dist/components/BlessDiff.vue_vue_type_script_setup_true_lang.js +148 -0
  49. package/dist/components/BlessDock.css +1 -0
  50. package/dist/components/BlessDock.js +6 -0
  51. package/dist/components/BlessDock.vue.d.ts +55 -0
  52. package/dist/components/BlessDock.vue_vue_type_script_setup_true_lang.js +100 -0
  53. package/dist/components/BlessEditor.vue.d.ts +2 -0
  54. package/dist/components/BlessEditor.vue_vue_type_script_setup_true_lang.js +23 -22
  55. package/dist/components/BlessFileInput.vue.d.ts +2 -0
  56. package/dist/components/BlessFileInput.vue_vue_type_script_setup_true_lang.js +3 -2
  57. package/dist/components/BlessFormula.css +1 -0
  58. package/dist/components/BlessFormula.js +6 -0
  59. package/dist/components/BlessFormula.vue.d.ts +53 -0
  60. package/dist/components/BlessFormula.vue_vue_type_script_setup_true_lang.js +111 -0
  61. package/dist/components/BlessGantt.css +1 -0
  62. package/dist/components/BlessGantt.js +6 -0
  63. package/dist/components/BlessGantt.vue.d.ts +81 -0
  64. package/dist/components/BlessGantt.vue_vue_type_script_setup_true_lang.js +276 -0
  65. package/dist/components/BlessGauge.css +1 -0
  66. package/dist/components/BlessGauge.js +6 -0
  67. package/dist/components/BlessGauge.vue.d.ts +36 -0
  68. package/dist/components/BlessGauge.vue_vue_type_script_setup_true_lang.js +100 -0
  69. package/dist/components/BlessHeatmapCalendar.css +1 -0
  70. package/dist/components/BlessHeatmapCalendar.js +6 -0
  71. package/dist/components/BlessHeatmapCalendar.vue.d.ts +38 -0
  72. package/dist/components/BlessHeatmapCalendar.vue_vue_type_script_setup_true_lang.js +146 -0
  73. package/dist/components/BlessHotspots.css +1 -0
  74. package/dist/components/BlessHotspots.js +6 -0
  75. package/dist/components/BlessHotspots.vue.d.ts +49 -0
  76. package/dist/components/BlessHotspots.vue_vue_type_script_setup_true_lang.js +127 -0
  77. package/dist/components/BlessInfiniteCanvas.css +1 -0
  78. package/dist/components/BlessInfiniteCanvas.js +6 -0
  79. package/dist/components/BlessInfiniteCanvas.vue.d.ts +91 -0
  80. package/dist/components/BlessInfiniteCanvas.vue_vue_type_script_setup_true_lang.js +232 -0
  81. package/dist/components/BlessInputNumber.vue.d.ts +5 -0
  82. package/dist/components/BlessInputNumber.vue_vue_type_script_setup_true_lang.js +39 -34
  83. package/dist/components/BlessKanban.css +1 -0
  84. package/dist/components/BlessKanban.js +6 -0
  85. package/dist/components/BlessKanban.vue.d.ts +67 -0
  86. package/dist/components/BlessKanban.vue_vue_type_script_setup_true_lang.js +195 -0
  87. package/dist/components/BlessLoadingBar.vue.d.ts +2 -0
  88. package/dist/components/BlessLoadingBar.vue_vue_type_script_setup_true_lang.js +8 -3
  89. package/dist/components/BlessLoupe.css +1 -0
  90. package/dist/components/BlessLoupe.js +6 -0
  91. package/dist/components/BlessLoupe.vue.d.ts +16 -0
  92. package/dist/components/BlessLoupe.vue_vue_type_script_setup_true_lang.js +93 -0
  93. package/dist/components/BlessMarquee.css +1 -0
  94. package/dist/components/BlessMarquee.js +6 -0
  95. package/dist/components/BlessMarquee.vue.d.ts +44 -0
  96. package/dist/components/BlessMarquee.vue_vue_type_script_setup_true_lang.js +69 -0
  97. package/dist/components/BlessMasonry.css +1 -0
  98. package/dist/components/BlessMasonry.js +6 -0
  99. package/dist/components/BlessMasonry.vue.d.ts +33 -0
  100. package/dist/components/BlessMasonry.vue_vue_type_script_setup_true_lang.js +79 -0
  101. package/dist/components/BlessMention.css +1 -0
  102. package/dist/components/BlessMention.js +6 -0
  103. package/dist/components/BlessMention.vue.d.ts +32 -0
  104. package/dist/components/BlessMention.vue_vue_type_script_setup_true_lang.js +116 -0
  105. package/dist/components/BlessNodeGraph.css +1 -0
  106. package/dist/components/BlessNodeGraph.js +6 -0
  107. package/dist/components/BlessNodeGraph.vue.d.ts +110 -0
  108. package/dist/components/BlessNodeGraph.vue_vue_type_script_setup_true_lang.js +321 -0
  109. package/dist/components/BlessOnboardingChecklist.css +1 -0
  110. package/dist/components/BlessOnboardingChecklist.js +6 -0
  111. package/dist/components/BlessOnboardingChecklist.vue.d.ts +72 -0
  112. package/dist/components/BlessOnboardingChecklist.vue_vue_type_script_setup_true_lang.js +157 -0
  113. package/dist/components/BlessOrderList.vue.d.ts +5 -0
  114. package/dist/components/BlessOrderList.vue_vue_type_script_setup_true_lang.js +62 -56
  115. package/dist/components/BlessPagination.vue.d.ts +2 -0
  116. package/dist/components/BlessPagination.vue_vue_type_script_setup_true_lang.js +2 -1
  117. package/dist/components/BlessPickList.vue.d.ts +5 -0
  118. package/dist/components/BlessPickList.vue_vue_type_script_setup_true_lang.js +55 -49
  119. package/dist/components/BlessRadialMenu.css +1 -0
  120. package/dist/components/BlessRadialMenu.js +6 -0
  121. package/dist/components/BlessRadialMenu.vue.d.ts +45 -0
  122. package/dist/components/BlessRadialMenu.vue_vue_type_script_setup_true_lang.js +146 -0
  123. package/dist/components/BlessRangeCalendar.css +1 -0
  124. package/dist/components/BlessRangeCalendar.js +6 -0
  125. package/dist/components/BlessRangeCalendar.vue.d.ts +51 -0
  126. package/dist/components/BlessRangeCalendar.vue_vue_type_script_setup_true_lang.js +217 -0
  127. package/dist/components/BlessScheduler.css +1 -0
  128. package/dist/components/BlessScheduler.js +6 -0
  129. package/dist/components/BlessScheduler.vue.d.ts +95 -0
  130. package/dist/components/BlessScheduler.vue_vue_type_script_setup_true_lang.js +347 -0
  131. package/dist/components/BlessShortcutRecorder.css +1 -0
  132. package/dist/components/BlessShortcutRecorder.js +6 -0
  133. package/dist/components/BlessShortcutRecorder.vue.d.ts +39 -0
  134. package/dist/components/BlessShortcutRecorder.vue_vue_type_script_setup_true_lang.js +126 -0
  135. package/dist/components/BlessSignaturePad.vue.d.ts +1 -1
  136. package/dist/components/BlessSliderCaptcha.css +1 -0
  137. package/dist/components/BlessSliderCaptcha.js +6 -0
  138. package/dist/components/BlessSliderCaptcha.vue.d.ts +38 -0
  139. package/dist/components/BlessSliderCaptcha.vue_vue_type_script_setup_true_lang.js +146 -0
  140. package/dist/components/BlessSortable.css +1 -0
  141. package/dist/components/BlessSortable.js +6 -0
  142. package/dist/components/BlessSortable.vue.d.ts +51 -0
  143. package/dist/components/BlessSortable.vue_vue_type_script_setup_true_lang.js +135 -0
  144. package/dist/components/BlessSparkline.css +1 -0
  145. package/dist/components/BlessSparkline.js +6 -0
  146. package/dist/components/BlessSparkline.vue.d.ts +28 -0
  147. package/dist/components/BlessSparkline.vue_vue_type_script_setup_true_lang.js +107 -0
  148. package/dist/components/BlessSplitView.css +1 -0
  149. package/dist/components/BlessSplitView.js +6 -0
  150. package/dist/components/BlessSplitView.vue.d.ts +61 -0
  151. package/dist/components/BlessSplitView.vue_vue_type_script_setup_true_lang.js +92 -0
  152. package/dist/components/BlessSteps.vue.d.ts +2 -0
  153. package/dist/components/BlessSteps.vue_vue_type_script_setup_true_lang.js +3 -2
  154. package/dist/components/BlessSwipeDeck.css +1 -0
  155. package/dist/components/BlessSwipeDeck.js +6 -0
  156. package/dist/components/BlessSwipeDeck.vue.d.ts +46 -0
  157. package/dist/components/BlessSwipeDeck.vue_vue_type_script_setup_true_lang.js +200 -0
  158. package/dist/components/BlessTimer.css +1 -0
  159. package/dist/components/BlessTimer.js +6 -0
  160. package/dist/components/BlessTimer.vue.d.ts +74 -0
  161. package/dist/components/BlessTimer.vue_vue_type_script_setup_true_lang.js +139 -0
  162. package/dist/components/BlessTour.vue.d.ts +1 -0
  163. package/dist/components/BlessTour.vue_vue_type_script_setup_true_lang.js +48 -42
  164. package/dist/components/BlessTreemap.css +1 -0
  165. package/dist/components/BlessTreemap.js +6 -0
  166. package/dist/components/BlessTreemap.vue.d.ts +46 -0
  167. package/dist/components/BlessTreemap.vue_vue_type_script_setup_true_lang.js +137 -0
  168. package/dist/components/BlessUploader.vue.d.ts +11 -0
  169. package/dist/components/BlessUploader.vue_vue_type_script_setup_true_lang.js +80 -69
  170. package/dist/composables/annotate.d.ts +35 -0
  171. package/dist/composables/annotate.js +33 -0
  172. package/dist/composables/canvasView.d.ts +21 -0
  173. package/dist/composables/canvasView.js +23 -0
  174. package/dist/composables/confetti.d.ts +32 -0
  175. package/dist/composables/confetti.js +23 -0
  176. package/dist/composables/cropBox.d.ts +22 -0
  177. package/dist/composables/cropBox.js +39 -0
  178. package/dist/composables/dayBlocks.d.ts +11 -0
  179. package/dist/composables/dayBlocks.js +26 -0
  180. package/dist/composables/diffLines.d.ts +10 -0
  181. package/dist/composables/diffLines.js +55 -0
  182. package/dist/composables/formula.d.ts +28 -0
  183. package/dist/composables/formula.js +161 -0
  184. package/dist/composables/graph.d.ts +19 -0
  185. package/dist/composables/graph.js +16 -0
  186. package/dist/composables/radial.d.ts +15 -0
  187. package/dist/composables/radial.js +22 -0
  188. package/dist/composables/schedule.d.ts +27 -0
  189. package/dist/composables/schedule.js +54 -0
  190. package/dist/composables/shortcut.d.ts +12 -0
  191. package/dist/composables/shortcut.js +35 -0
  192. package/dist/composables/treemap.d.ts +23 -0
  193. package/dist/composables/treemap.js +77 -0
  194. package/dist/composables/useAutoScroll.d.ts +15 -0
  195. package/dist/composables/useAutoScroll.js +32 -0
  196. package/dist/composables/useSortable.d.ts +58 -0
  197. package/dist/composables/useSortable.js +107 -0
  198. package/dist/index.d.ts +62 -1
  199. package/dist/index.js +93 -53
  200. package/package.json +22 -18
@@ -1,13 +1,18 @@
1
1
  import { loadingBarState as e, useLoadingBar as t } from "../composables/useLoadingBar.js";
2
2
  import { createElementBlock as n, createElementVNode as r, defineComponent as i, normalizeClass as a, normalizeStyle as o, openBlock as s, unref as c } from "vue";
3
3
  //#region src/components/BlessLoadingBar.vue?vue&type=script&setup=true&lang.ts
4
- var l = ["aria-valuenow", "aria-hidden"], u = /*@__PURE__*/ i({
4
+ var l = [
5
+ "aria-valuenow",
6
+ "aria-label",
7
+ "aria-hidden"
8
+ ], u = /*@__PURE__*/ i({
5
9
  name: "BlessLoadingBar",
6
10
  __name: "BlessLoadingBar",
7
11
  props: {
8
12
  height: { default: "3px" },
9
13
  position: { default: "top" },
10
- color: { default: "accent" }
14
+ color: { default: "accent" },
15
+ label: { default: "Loading" }
11
16
  },
12
17
  setup(i) {
13
18
  return t(), (t, u) => (s(), n("div", {
@@ -24,7 +29,7 @@ var l = ["aria-valuenow", "aria-hidden"], u = /*@__PURE__*/ i({
24
29
  "aria-valuenow": c(e).active ? Math.round(c(e).progress) : void 0,
25
30
  "aria-valuemin": "0",
26
31
  "aria-valuemax": "100",
27
- "aria-label": "Loading",
32
+ "aria-label": i.label,
28
33
  "aria-hidden": c(e).active ? void 0 : "true"
29
34
  }, [...u[0] ||= [r("span", { class: "bless-loadingbar__bar" }, null, -1)]], 14, l));
30
35
  }
@@ -0,0 +1 @@
1
+ .bless-loupe{cursor:zoom-in;touch-action:pan-y pinch-zoom;-webkit-user-select:none;user-select:none;max-width:100%;line-height:0;display:inline-block;position:relative}.bless-loupe:focus-visible{outline:2px solid var(--bless-color-accent);outline-offset:2px}.bless-loupe__img{max-width:100%;height:auto;display:block}.bless-loupe__lens{z-index:1;pointer-events:none;background-repeat:no-repeat;background-color:var(--bless-color-surface);border:2px solid var(--bless-color-bg);outline:1px solid var(--bless-color-text);box-shadow:var(--bless-shadow-plate);position:absolute}
@@ -0,0 +1,6 @@
1
+ import "./BlessLoupe.css";
2
+ import e from "./BlessLoupe.vue_vue_type_script_setup_true_lang.js";
3
+ //#region src/components/BlessLoupe.vue
4
+ var t = e;
5
+ //#endregion
6
+ export { t as default };
@@ -0,0 +1,16 @@
1
+ type __VLS_Props = {
2
+ src: string;
3
+ alt: string;
4
+ /** a larger version of the same picture for the lens; defaults to `src` */
5
+ zoomSrc?: string;
6
+ /** magnification */
7
+ zoom?: number;
8
+ /** side of the square lens, in px */
9
+ size?: number;
10
+ };
11
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
12
+ size: number;
13
+ zoom: number;
14
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
15
+ declare const _default: typeof __VLS_export;
16
+ export default _default;
@@ -0,0 +1,93 @@
1
+ import { computed as e, createCommentVNode as t, createElementBlock as n, createElementVNode as r, defineComponent as i, normalizeStyle as a, openBlock as o, ref as s } from "vue";
2
+ //#region src/components/BlessLoupe.vue?vue&type=script&setup=true&lang.ts
3
+ var c = ["src", "alt"], l = /*@__PURE__*/ i({
4
+ name: "BlessLoupe",
5
+ __name: "BlessLoupe",
6
+ props: {
7
+ src: {},
8
+ alt: {},
9
+ zoomSrc: {},
10
+ zoom: { default: 2.5 },
11
+ size: { default: 140 }
12
+ },
13
+ setup(i) {
14
+ let l = i, u = s(), d = s(null), f = s({
15
+ w: 1,
16
+ h: 1
17
+ }), p = s(!1), m = s({
18
+ x: .5,
19
+ y: .5
20
+ });
21
+ function h(e, t) {
22
+ let n = u.value.getBoundingClientRect();
23
+ f.value = {
24
+ w: n.width,
25
+ h: n.height
26
+ }, d.value = {
27
+ x: Math.min(n.width, Math.max(0, e - n.left)),
28
+ y: Math.min(n.height, Math.max(0, t - n.top))
29
+ };
30
+ }
31
+ function g(e) {
32
+ p.value = e.pointerType === "touch" || e.pointerType === "pen", h(e.clientX, e.clientY);
33
+ }
34
+ let _ = () => d.value = null;
35
+ function v() {
36
+ let e = u.value.getBoundingClientRect();
37
+ h(e.left + m.value.x * e.width, e.top + m.value.y * e.height);
38
+ }
39
+ function y(e) {
40
+ let t = e.shiftKey ? .2 : .05, n = {
41
+ ArrowLeft: [-t, 0],
42
+ ArrowRight: [t, 0],
43
+ ArrowUp: [0, -t],
44
+ ArrowDown: [0, t]
45
+ };
46
+ if (e.key === "Escape") return _();
47
+ n[e.key] && (e.preventDefault(), p.value = !1, m.value = {
48
+ x: Math.min(1, Math.max(0, m.value.x + n[e.key][0])),
49
+ y: Math.min(1, Math.max(0, m.value.y + n[e.key][1]))
50
+ }, v());
51
+ }
52
+ let b = e(() => {
53
+ let e = d.value;
54
+ if (!e) return;
55
+ let { zoom: t, size: n } = l, r = p.value ? n / 2 + 28 : 0;
56
+ return {
57
+ width: `${n}px`,
58
+ height: `${n}px`,
59
+ left: `${e.x - n / 2}px`,
60
+ top: `${e.y - n / 2 - r}px`,
61
+ backgroundImage: `url(${l.zoomSrc ?? l.src})`,
62
+ backgroundSize: `${f.value.w * t}px ${f.value.h * t}px`,
63
+ backgroundPosition: `${n / 2 - e.x * t}px ${n / 2 - e.y * t}px`
64
+ };
65
+ });
66
+ return (e, s) => (o(), n("div", {
67
+ ref_key: "root",
68
+ ref: u,
69
+ class: "bless-loupe",
70
+ tabindex: "0",
71
+ onPointerenter: g,
72
+ onPointermove: g,
73
+ onPointerleave: _,
74
+ onPointercancel: _,
75
+ onPointerup: s[0] ||= (e) => p.value && _(),
76
+ onFocus: v,
77
+ onBlur: _,
78
+ onKeydown: y
79
+ }, [r("img", {
80
+ src: i.src,
81
+ alt: i.alt,
82
+ class: "bless-loupe__img",
83
+ draggable: "false"
84
+ }, null, 8, c), b.value ? (o(), n("span", {
85
+ key: 0,
86
+ class: "bless-loupe__lens",
87
+ style: a(b.value),
88
+ "aria-hidden": "true"
89
+ }, null, 4)) : t("", !0)], 544));
90
+ }
91
+ });
92
+ //#endregion
93
+ export { l as default };
@@ -0,0 +1 @@
1
+ .bless-marquee{align-items:center;gap:var(--bless-space-2);--bless-marquee-dir:1;min-width:0;max-width:100%;font-family:var(--bless-font-sans);color:var(--bless-color-text);display:flex;position:relative}[dir=rtl] .bless-marquee{--bless-marquee-dir:-1}.bless-marquee__viewport{flex:1;min-width:0;overflow:hidden}.bless-marquee__track{width:max-content;animation:bless-marquee var(--bless-marquee-time) linear infinite;display:flex}.bless-marquee--reverse .bless-marquee__track{animation-direction:reverse}.bless-marquee__run{align-items:center;gap:var(--bless-space-6);flex:none;padding-inline-end:var(--bless-space-6);display:flex}.bless-marquee--paused .bless-marquee__track,.bless-marquee--hover:hover .bless-marquee__track,.bless-marquee--hover:focus-within .bless-marquee__track{animation-play-state:paused}.bless-marquee--still .bless-marquee__track{flex-wrap:wrap;width:auto;animation:none}.bless-marquee--still .bless-marquee__run:last-child{display:none}.bless-marquee__btn{padding:var(--bless-space-1) var(--bless-space-2);border:var(--bless-border-width) solid var(--bless-color-border);background:var(--bless-color-bg);color:inherit;font:inherit;font-size:var(--bless-text-xs);cursor:pointer;flex:none}.bless-marquee__btn:focus-visible{outline:2px solid var(--bless-color-accent);outline-offset:2px}@keyframes bless-marquee{to{transform:translateX(calc(var(--bless-marquee-dir) * -50%))}}@media (prefers-reduced-motion:reduce){.bless-marquee__track{animation:none}}
@@ -0,0 +1,6 @@
1
+ import "./BlessMarquee.css";
2
+ import e from "./BlessMarquee.vue_vue_type_script_setup_true_lang.js";
3
+ //#region src/components/BlessMarquee.vue
4
+ var t = e;
5
+ //#endregion
6
+ export { t as default };
@@ -0,0 +1,44 @@
1
+ type __VLS_Props = {
2
+ /** px per second */
3
+ speed?: number;
4
+ /** run the other way (toward the start of the line) */
5
+ reverse?: boolean;
6
+ /** stop while the pointer is over it or focus is inside */
7
+ pauseOnHover?: boolean;
8
+ /** show the Pause button (needed when it moves for more than five seconds, WCAG 2.2.2) */
9
+ controls?: boolean;
10
+ label?: string;
11
+ labels?: Partial<{
12
+ play: string;
13
+ pause: string;
14
+ }>;
15
+ };
16
+ type __VLS_ModelProps = {
17
+ /** true while paused by the button */
18
+ "paused"?: boolean;
19
+ };
20
+ type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
21
+ declare var __VLS_1: {}, __VLS_3: {};
22
+ type __VLS_Slots = {} & {
23
+ default?: (props: typeof __VLS_1) => any;
24
+ } & {
25
+ default?: (props: typeof __VLS_3) => any;
26
+ };
27
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
28
+ "update:paused": (value: boolean) => any;
29
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
30
+ "onUpdate:paused"?: ((value: boolean) => any) | undefined;
31
+ }>, {
32
+ label: string;
33
+ controls: boolean;
34
+ speed: number;
35
+ pauseOnHover: boolean;
36
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
37
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
38
+ declare const _default: typeof __VLS_export;
39
+ export default _default;
40
+ type __VLS_WithSlots<T, S> = T & {
41
+ new (): {
42
+ $slots: S;
43
+ };
44
+ };
@@ -0,0 +1,69 @@
1
+ import { reducedMotion as e } from "../composables/useMedia.js";
2
+ import { computed as t, createCommentVNode as n, createElementBlock as r, createElementVNode as i, defineComponent as a, mergeModels as o, normalizeClass as s, normalizeStyle as c, onBeforeUnmount as l, onMounted as u, openBlock as d, ref as f, renderSlot as p, toDisplayString as m, useModel as h } from "vue";
3
+ //#region src/components/BlessMarquee.vue?vue&type=script&setup=true&lang.ts
4
+ var g = ["aria-label"], _ = { class: "bless-marquee__viewport" }, v = { class: "bless-marquee__track" }, y = {
5
+ class: "bless-marquee__run",
6
+ "aria-hidden": "true",
7
+ inert: ""
8
+ }, b = ["aria-pressed"], x = /*@__PURE__*/ a({
9
+ name: "BlessMarquee",
10
+ __name: "BlessMarquee",
11
+ props: /*@__PURE__*/ o({
12
+ speed: { default: 40 },
13
+ reverse: { type: Boolean },
14
+ pauseOnHover: {
15
+ type: Boolean,
16
+ default: !0
17
+ },
18
+ controls: {
19
+ type: Boolean,
20
+ default: !0
21
+ },
22
+ label: { default: "Scrolling items" },
23
+ labels: {}
24
+ }, {
25
+ paused: {
26
+ type: Boolean,
27
+ default: !1
28
+ },
29
+ pausedModifiers: {}
30
+ }),
31
+ emits: ["update:paused"],
32
+ setup(a) {
33
+ let o = a, x = t(() => ({
34
+ play: "Play",
35
+ pause: "Pause",
36
+ ...o.labels
37
+ })), S = h(a, "paused"), C = f(), w = f(!1), T = f(20), E;
38
+ function D() {
39
+ let e = C.value?.scrollWidth ?? 0;
40
+ T.value = e && o.speed > 0 ? e / o.speed : 20;
41
+ }
42
+ return u(() => {
43
+ w.value = e(), D(), typeof ResizeObserver < "u" && C.value && (E = new ResizeObserver(D), E.observe(C.value));
44
+ }), l(() => E?.disconnect()), (e, t) => (d(), r("div", {
45
+ class: s(["bless-marquee", {
46
+ "bless-marquee--paused": S.value,
47
+ "bless-marquee--hover": a.pauseOnHover,
48
+ "bless-marquee--still": w.value,
49
+ "bless-marquee--reverse": a.reverse
50
+ }]),
51
+ role: "group",
52
+ "aria-roledescription": "marquee",
53
+ "aria-label": a.label,
54
+ style: c({ "--bless-marquee-time": `${T.value}s` })
55
+ }, [i("div", _, [i("div", v, [i("div", {
56
+ ref_key: "run",
57
+ ref: C,
58
+ class: "bless-marquee__run"
59
+ }, [p(e.$slots, "default")], 512), i("div", y, [p(e.$slots, "default")])])]), a.controls && !w.value ? (d(), r("button", {
60
+ key: 0,
61
+ type: "button",
62
+ class: "bless-marquee__btn",
63
+ "aria-pressed": S.value,
64
+ onClick: t[0] ||= (e) => S.value = !S.value
65
+ }, m(S.value ? x.value.play : x.value.pause), 9, b)) : n("", !0)], 14, g));
66
+ }
67
+ });
68
+ //#endregion
69
+ export { x as default };
@@ -0,0 +1 @@
1
+ .bless-masonry{gap:var(--bless-masonry-gap,16px);min-width:0;display:grid;position:relative}.bless-masonry--ready{display:block}.bless-masonry--ready>.bless-masonry__cell{position:absolute;inset-block-start:0;inset-inline-start:0}.bless-masonry--animate>.bless-masonry__cell{transition:transform var(--bless-duration-slow) var(--bless-ease-out)}[dir=rtl] .bless-masonry--ready>.bless-masonry__cell{inset-inline:auto 0}@media (prefers-reduced-motion:reduce){.bless-masonry--animate>.bless-masonry__cell{transition:none}}
@@ -0,0 +1,6 @@
1
+ import "./BlessMasonry.css";
2
+ import e from "./BlessMasonry.vue_vue_type_script_setup_true_lang.js";
3
+ //#region src/components/BlessMasonry.vue
4
+ var t = e;
5
+ //#endregion
6
+ export { t as default };
@@ -0,0 +1,33 @@
1
+ declare const __VLS_export: <T>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
2
+ props: import('vue').PublicProps & __VLS_PrettifyLocal<{
3
+ items: T[];
4
+ rowKey?: (item: T, index: number) => string | number;
5
+ /** a fixed number of columns; leave out to fit as many as `minWidth` allows */
6
+ columns?: number;
7
+ /** narrowest a column may get, in px, when `columns` is not set */
8
+ minWidth?: number;
9
+ /** space between cards, in px */
10
+ gap?: number;
11
+ label?: string;
12
+ }> & (typeof globalThis extends {
13
+ __VLS_PROPS_FALLBACK: infer P;
14
+ } ? P : {});
15
+ expose: (exposed: {}) => void;
16
+ attrs: any;
17
+ slots: {
18
+ default?: (props: {
19
+ item: T;
20
+ index: number;
21
+ }) => any;
22
+ };
23
+ emit: {};
24
+ }>) => import('vue').VNode & {
25
+ __ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
26
+ };
27
+ declare const _default: typeof __VLS_export;
28
+ export default _default;
29
+ type __VLS_PrettifyLocal<T> = (T extends any ? {
30
+ [K in keyof T]: T[K];
31
+ } : {
32
+ [K in keyof T as K]: T[K];
33
+ }) & {};
@@ -0,0 +1,79 @@
1
+ import { Fragment as e, createElementBlock as t, createTextVNode as n, defineComponent as r, nextTick as i, normalizeClass as a, normalizeStyle as o, onBeforeUnmount as s, onMounted as c, openBlock as l, ref as u, renderList as d, renderSlot as f, toDisplayString as p, watch as m } from "vue";
2
+ //#region src/components/BlessMasonry.vue?vue&type=script&setup=true&lang.ts
3
+ var h = ["aria-label"], g = /*@__PURE__*/ r({
4
+ name: "BlessMasonry",
5
+ __name: "BlessMasonry",
6
+ props: {
7
+ items: {},
8
+ rowKey: {},
9
+ columns: {},
10
+ minWidth: { default: 240 },
11
+ gap: { default: 16 },
12
+ label: {}
13
+ },
14
+ setup(r) {
15
+ let g = r, _ = u(), v = u([]), y = u(!1), b = u(0), x = u([]), S = u(0), C = u(!1), w = u(!1), T = (e, t) => {
16
+ e && (v.value[t] = e);
17
+ };
18
+ function E() {
19
+ let e = _.value;
20
+ if (!e) return;
21
+ let t = e.clientWidth, n = g.columns ?? Math.max(1, Math.floor((t + g.gap) / (g.minWidth + g.gap)));
22
+ b.value = (t - g.gap * (n - 1)) / n, i(D);
23
+ }
24
+ function D() {
25
+ let e = _.value;
26
+ if (!e || !b.value) return;
27
+ C.value = getComputedStyle(e).direction === "rtl";
28
+ let t = e.clientWidth, n = Math.max(1, Math.round((t + g.gap) / (b.value + g.gap))), r = Array(n).fill(0);
29
+ x.value = g.items.map((e, t) => {
30
+ let n = r.indexOf(Math.min(...r)), i = {
31
+ left: n * (b.value + g.gap),
32
+ top: r[n]
33
+ };
34
+ return r[n] = i.top + (v.value[t]?.offsetHeight ?? 0) + g.gap, i;
35
+ }), S.value = Math.max(0, Math.max(...r) - g.gap), y.value = !0, requestAnimationFrame(() => w.value = !0);
36
+ }
37
+ let O, k = /* @__PURE__ */ new Set();
38
+ function A() {
39
+ if (O) for (let e of v.value) e && !k.has(e) && (O.observe(e), k.add(e));
40
+ }
41
+ return c(() => {
42
+ typeof ResizeObserver < "u" && (O = new ResizeObserver((e) => {
43
+ e.some((e) => e.target === _.value) ? E() : D();
44
+ }), _.value && O.observe(_.value)), E(), i(A);
45
+ }), s(() => O?.disconnect()), m(() => [
46
+ g.items,
47
+ g.columns,
48
+ g.minWidth,
49
+ g.gap
50
+ ], () => i(() => {
51
+ v.value.length = g.items.length, k = new Set([...k].filter((e) => e.isConnected)), A(), E();
52
+ })), (i, s) => (l(), t("div", {
53
+ ref_key: "root",
54
+ ref: _,
55
+ class: a(["bless-masonry", {
56
+ "bless-masonry--ready": y.value,
57
+ "bless-masonry--animate": w.value
58
+ }]),
59
+ role: "list",
60
+ "aria-label": r.label,
61
+ style: o(y.value ? { height: `${S.value}px` } : { "--bless-masonry-gap": `${r.gap}px` })
62
+ }, [(l(!0), t(e, null, d(r.items, (e, a) => (l(), t("div", {
63
+ key: r.rowKey ? r.rowKey(e, a) : a,
64
+ ref_for: !0,
65
+ ref: (e) => T(e, a),
66
+ class: "bless-masonry__cell",
67
+ role: "listitem",
68
+ style: o(b.value ? {
69
+ width: `${b.value}px`,
70
+ ...y.value && { transform: `translate(${(C.value ? -1 : 1) * (x.value[a]?.left ?? 0)}px, ${x.value[a]?.top ?? 0}px)` }
71
+ } : void 0)
72
+ }, [f(i.$slots, "default", {
73
+ item: e,
74
+ index: a
75
+ }, () => [n(p(e), 1)])], 4))), 128))], 14, h));
76
+ }
77
+ });
78
+ //#endregion
79
+ export { g as default };
@@ -0,0 +1 @@
1
+ .bless-mention{position:relative}.bless-mention__panel{inset:unset;border:var(--bless-border-width) solid var(--bless-color-border);background:var(--bless-color-bg);color:var(--bless-color-text);box-shadow:var(--bless-shadow-plate);margin:0;padding:0;position:fixed}.bless-mention__list{max-height:240px;padding:var(--bless-space-1) 0;scrollbar-width:thin;overflow-y:auto}.bless-mention__option{align-items:baseline;gap:var(--bless-space-2);padding:var(--bless-space-2) var(--bless-space-3);font-family:var(--bless-font-sans);font-size:var(--bless-text-sm);cursor:pointer;display:flex}.bless-mention__option small{color:var(--bless-color-text-muted);font-size:var(--bless-text-xs)}.bless-mention__option--active{background:var(--bless-color-surface)}
@@ -0,0 +1,6 @@
1
+ import "./BlessMention.css";
2
+ import e from "./BlessMention.vue_vue_type_script_setup_true_lang.js";
3
+ //#region src/components/BlessMention.vue
4
+ var t = e;
5
+ //#endregion
6
+ export { t as default };
@@ -0,0 +1,32 @@
1
+ export interface BlessMentionOption {
2
+ /** inserted after the trigger: `@mika` */
3
+ value: string;
4
+ label: string;
5
+ /** muted second line, e.g. a role or an email */
6
+ hint?: string;
7
+ }
8
+ type __VLS_Props = {
9
+ /** one list for every trigger, or `{ "@": [...], "#": [...] }` to give each its own */
10
+ options: BlessMentionOption[] | Record<string, BlessMentionOption[]>;
11
+ /** characters that open the list when they start a word; ignored when `options` is a record */
12
+ triggers?: string[];
13
+ limit?: number;
14
+ label?: string;
15
+ };
16
+ type __VLS_ModelProps = {
17
+ modelValue?: string;
18
+ };
19
+ type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
20
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
21
+ select: (option: BlessMentionOption, trigger: string) => any;
22
+ "update:modelValue": (value: string) => any;
23
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
24
+ onSelect?: ((option: BlessMentionOption, trigger: string) => any) | undefined;
25
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
26
+ }>, {
27
+ label: string;
28
+ triggers: string[];
29
+ limit: number;
30
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
31
+ declare const _default: typeof __VLS_export;
32
+ export default _default;
@@ -0,0 +1,116 @@
1
+ import e from "./BlessTextarea.js";
2
+ import { useFloating as t } from "../composables/useFloating.js";
3
+ import { Fragment as n, computed as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, createVNode as s, defineComponent as c, mergeModels as l, mergeProps as u, nextTick as d, normalizeClass as f, normalizeStyle as p, openBlock as m, ref as h, renderList as g, toDisplayString as _, unref as v, useId as y, useModel as b, watch as x, withKeys as S, withModifiers as C } from "vue";
4
+ //#region src/components/BlessMention.vue?vue&type=script&setup=true&lang.ts
5
+ var w = ["id", "aria-label"], T = [
6
+ "id",
7
+ "aria-selected",
8
+ "onMousedown",
9
+ "onMousemove"
10
+ ], E = { key: 0 }, D = /*@__PURE__*/ c({
11
+ name: "BlessMention",
12
+ inheritAttrs: !1,
13
+ __name: "BlessMention",
14
+ props: /*@__PURE__*/ l({
15
+ options: {},
16
+ triggers: { default: () => ["@"] },
17
+ limit: { default: 8 },
18
+ label: { default: "Suggestions" }
19
+ }, {
20
+ modelValue: { default: "" },
21
+ modelModifiers: {}
22
+ }),
23
+ emits: /*@__PURE__*/ l(["select"], ["update:modelValue"]),
24
+ setup(c, { emit: l }) {
25
+ let D = c, O = b(c, "modelValue"), k = l, A = y(), j = h(), M = h(), N = h(!1), P = h(0), F = h({
26
+ trigger: "",
27
+ query: "",
28
+ start: 0
29
+ }), { x: I, y: L } = t(j, M, N, {
30
+ placement: "bottom-start",
31
+ offset: 4
32
+ }), R = r(() => Array.isArray(D.options) ? D.triggers : Object.keys(D.options)), z = r(() => {
33
+ let e = Array.isArray(D.options) ? D.options : D.options[F.value.trigger] ?? [], t = F.value.query.toLowerCase();
34
+ return e.filter((e) => !t || e.label.toLowerCase().includes(t) || e.value.toLowerCase().includes(t)).slice(0, D.limit);
35
+ }), B = () => j.value?.querySelector("textarea") ?? null;
36
+ function V() {
37
+ let e = B();
38
+ if (!e || e.selectionStart !== e.selectionEnd) return H();
39
+ let t = e.selectionStart, n = e.value.slice(0, t), r = /(^|\s)(\S)([^\s]*)$/.exec(n);
40
+ if (!r || !R.value.includes(r[2])) return H();
41
+ let i = {
42
+ trigger: r[2],
43
+ query: r[3],
44
+ start: t - r[2].length - r[3].length
45
+ };
46
+ (i.trigger !== F.value.trigger || i.query !== F.value.query) && (P.value = 0), F.value = i, N.value = z.value.length > 0;
47
+ }
48
+ let H = () => N.value = !1;
49
+ function U(e) {
50
+ let t = B();
51
+ if (!t) return;
52
+ let { trigger: n, start: r } = F.value, i = `${n}${e.value} `, a = t.selectionStart;
53
+ O.value = t.value.slice(0, r) + i + t.value.slice(a), k("select", e, n), H(), d(() => {
54
+ t.focus(), t.setSelectionRange(r + i.length, r + i.length);
55
+ });
56
+ }
57
+ function W(e) {
58
+ if (!N.value || e.isComposing) return;
59
+ let t = z.value.length;
60
+ e.key === "ArrowDown" || e.key === "ArrowUp" ? (e.preventDefault(), P.value = (P.value + (e.key === "ArrowDown" ? 1 : t - 1)) % t) : e.key === "Enter" || e.key === "Tab" ? (e.preventDefault(), U(z.value[P.value])) : e.key === "Escape" && (e.preventDefault(), e.stopPropagation(), H());
61
+ }
62
+ let G = () => d(V);
63
+ return x(N, (e) => d(() => {
64
+ let t = M.value;
65
+ t && typeof t.showPopover == "function" && (e && !t.matches(":popover-open") ? t.showPopover() : !e && t.matches(":popover-open") && t.hidePopover());
66
+ })), (t, r) => (m(), a("div", {
67
+ ref_key: "root",
68
+ ref: j,
69
+ class: "bless-mention",
70
+ onInput: G,
71
+ onKeydown: W,
72
+ onKeyup: [S(G, ["left"]), S(G, ["right"])],
73
+ onClick: G,
74
+ onFocusout: H
75
+ }, [s(e, u(t.$attrs, {
76
+ modelValue: O.value,
77
+ "onUpdate:modelValue": r[0] ||= (e) => O.value = e,
78
+ role: "combobox",
79
+ "aria-autocomplete": "list",
80
+ "aria-haspopup": "listbox",
81
+ "aria-expanded": N.value,
82
+ "aria-controls": `${v(A)}-list`,
83
+ "aria-activedescendant": N.value ? `${v(A)}-opt-${P.value}` : void 0
84
+ }), null, 16, [
85
+ "modelValue",
86
+ "aria-expanded",
87
+ "aria-controls",
88
+ "aria-activedescendant"
89
+ ]), o("div", {
90
+ ref_key: "panel",
91
+ ref: M,
92
+ popover: "manual",
93
+ class: "bless-mention__panel",
94
+ style: p({
95
+ left: `${v(I)}px`,
96
+ top: `${v(L)}px`,
97
+ minWidth: j.value ? `${Math.min(j.value.offsetWidth, 280)}px` : void 0
98
+ })
99
+ }, [o("div", {
100
+ id: `${v(A)}-list`,
101
+ role: "listbox",
102
+ "aria-label": c.label,
103
+ class: "bless-mention__list"
104
+ }, [(m(!0), a(n, null, g(N.value ? z.value : [], (e, t) => (m(), a("div", {
105
+ id: `${v(A)}-opt-${t}`,
106
+ key: e.value,
107
+ role: "option",
108
+ class: f(["bless-mention__option", { "bless-mention__option--active": t === P.value }]),
109
+ "aria-selected": t === P.value,
110
+ onMousedown: C((t) => U(e), ["prevent"]),
111
+ onMousemove: (e) => P.value = t
112
+ }, [o("span", null, _(e.label), 1), e.hint ? (m(), a("small", E, _(e.hint), 1)) : i("", !0)], 42, T))), 128))], 8, w)], 4)], 544));
113
+ }
114
+ });
115
+ //#endregion
116
+ export { D as default };
@@ -0,0 +1 @@
1
+ .bless-graph{flex-direction:column;width:100%;display:flex;position:relative}.bless-graph>.bless-canvas{flex:1}.bless-graph__edges{pointer-events:none;width:1px;height:1px;position:absolute;top:0;left:0;overflow:visible}.bless-graph__edge{fill:none;stroke:var(--bless-color-text-muted);stroke-width:2px}.bless-graph__edge--sel{stroke:var(--bless-color-accent);stroke-width:3px}.bless-graph__edge--preview{stroke:var(--bless-color-accent);stroke-dasharray:6 4}.bless-graph__arrow{fill:var(--bless-color-text-muted)}.bless-graph__edge-hit{fill:none;stroke:#0000;stroke-width:14px;pointer-events:stroke;cursor:pointer}.bless-graph__node{box-sizing:border-box;padding:0 var(--bless-space-3);background:var(--bless-color-bg);border:var(--bless-border-width) solid var(--bless-color-border);cursor:grab;touch-action:none;justify-content:center;align-items:center;display:flex;position:absolute}.bless-graph__node:focus-visible{outline:2px solid var(--bless-color-accent);outline-offset:2px}.bless-graph__node--sel{border-color:var(--bless-color-accent)}.bless-graph__node--target{outline:2px dashed var(--bless-color-accent);outline-offset:2px}.bless-graph__node--drag{cursor:grabbing}.bless-graph__label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bless-graph__port{background:var(--bless-color-surface);border:var(--bless-border-width) solid var(--bless-color-text-muted);width:12px;height:12px;margin-top:-6px;position:absolute;top:50%}.bless-graph__port--in{left:-7px}.bless-graph__port--out{cursor:crosshair;touch-action:none;right:-7px}.bless-graph__port--out:hover{border-color:var(--bless-color-accent)}.bless-graph__live{clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}
@@ -0,0 +1,6 @@
1
+ import "./BlessNodeGraph.css";
2
+ import e from "./BlessNodeGraph.vue_vue_type_script_setup_true_lang.js";
3
+ //#region src/components/BlessNodeGraph.vue
4
+ var t = e;
5
+ //#endregion
6
+ export { t as default };