@nmorph/nmorph-ui-kit 2.2.43 → 2.2.45

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 (52) hide show
  1. package/dist/assets/icons/burger.svg.js +5 -5
  2. package/dist/assets/icons/download.svg.js +5 -5
  3. package/dist/assets/icons/open.svg.js +2 -2
  4. package/dist/assets/icons/search.svg.js +1 -1
  5. package/dist/assets/icons/smile.svg.js +4 -4
  6. package/dist/components/basic/nmorph-button/NmorphButton.vue.js +16 -16
  7. package/dist/components/basic/nmorph-scroll/NmorphScroll.css +1 -1
  8. package/dist/components/basic/nmorph-scroll/NmorphScroll.vue.js +179 -74
  9. package/dist/components/data/nmorph-audio-preview/NmorphAudioPreview.css +1 -0
  10. package/dist/components/data/nmorph-audio-preview/NmorphAudioPreview.vue.js +207 -0
  11. package/dist/components/data/nmorph-audio-preview/NmorphAudioPreview.vue3.js +6 -0
  12. package/dist/components/data/nmorph-emoji-picker/NmorphEmojiPicker.css +1 -0
  13. package/dist/components/data/nmorph-emoji-picker/NmorphEmojiPicker.vue.js +405 -0
  14. package/dist/components/data/nmorph-emoji-picker/NmorphEmojiPicker.vue3.js +6 -0
  15. package/dist/components/data/nmorph-file-card/NmorphFileCard.css +1 -0
  16. package/dist/components/data/nmorph-file-card/NmorphFileCard.vue.js +124 -0
  17. package/dist/components/data/nmorph-file-card/NmorphFileCard.vue3.js +6 -0
  18. package/dist/components/data/nmorph-media-tile/NmorphMediaTile.vue.js +8 -8
  19. package/dist/components/data/nmorph-video-preview/NmorphVideoPreview.css +1 -0
  20. package/dist/components/data/nmorph-video-preview/NmorphVideoPreview.vue.js +147 -0
  21. package/dist/components/data/nmorph-video-preview/NmorphVideoPreview.vue3.js +6 -0
  22. package/dist/components/form/nmorph-file-upload/NmorphFileUpload.css +1 -1
  23. package/dist/components/form/nmorph-file-upload/NmorphFileUpload.vue.js +154 -125
  24. package/dist/components/form/nmorph-file-upload/types.js +9 -9
  25. package/dist/hooks/use-common-styles.js +92 -12
  26. package/dist/index.es.js +861 -849
  27. package/dist/index.umd.js +108 -28
  28. package/dist/package.json.js +1 -1
  29. package/dist/src/components/basic/nmorph-scroll/NmorphScroll.vue.d.ts +1 -0
  30. package/dist/src/components/data/index.d.ts +8 -0
  31. package/dist/src/components/data/nmorph-audio-preview/NmorphAudioPreview.vue.d.ts +38 -0
  32. package/dist/src/components/data/nmorph-audio-preview/types.d.ts +20 -0
  33. package/dist/src/components/data/nmorph-calendar/NmorphCalendar.vue.d.ts +1 -1
  34. package/dist/src/components/data/nmorph-emoji-picker/NmorphEmojiPicker.vue.d.ts +25 -0
  35. package/dist/src/components/data/nmorph-emoji-picker/types.d.ts +51 -0
  36. package/dist/src/components/data/nmorph-file-card/NmorphFileCard.vue.d.ts +30 -0
  37. package/dist/src/components/data/nmorph-file-card/types.d.ts +18 -0
  38. package/dist/src/components/data/nmorph-media-tile/NmorphMediaTile.vue.d.ts +1 -1
  39. package/dist/src/components/data/nmorph-video-preview/NmorphVideoPreview.vue.d.ts +41 -0
  40. package/dist/src/components/data/nmorph-video-preview/types.d.ts +27 -0
  41. package/dist/src/components/form/nmorph-date-picker/inner-components/nmorph-year-month-picker/NmorphYearMonthPicker.vue.d.ts +1 -1
  42. package/dist/src/components/form/nmorph-file-upload/NmorphFileUpload.vue.d.ts +1 -1
  43. package/dist/src/components/form/nmorph-file-upload/types.d.ts +4 -0
  44. package/dist/src/components/form/nmorph-number-input/NmorphNumberInput.vue.d.ts +1 -1
  45. package/dist/src/components/form/nmorph-slider/NmorphSlider.vue.d.ts +1 -1
  46. package/dist/src/components/form/nmorph-text-input/NmorphTextInput.vue.d.ts +1 -1
  47. package/dist/src/components/form/nmorph-textarea/NmorphTextarea.vue.d.ts +1 -1
  48. package/dist/src/components/navigation/nmorph-backtop/NmorphBacktop.vue.d.ts +1 -1
  49. package/dist/src/utils/file-types.d.ts +8 -1
  50. package/dist/style.css +1 -1
  51. package/dist/utils/file-types.js +28 -21
  52. package/package.json +23 -24
@@ -0,0 +1,207 @@
1
+ import './NmorphAudioPreview.css';
2
+ import { defineComponent as q, useSlots as G, ref as _, watch as J, computed as l, openBlock as t, createElementBlock as p, normalizeStyle as N, normalizeClass as K, createElementVNode as i, createBlock as h, unref as r, withCtx as m, createVNode as s, toDisplayString as y, withDirectives as Q, vModelText as W, renderSlot as X, createCommentVNode as H } from "vue";
3
+ import { useModifiers as Y } from "../../../utils/create-modifiers.js";
4
+ import { createCssSizeVariables as Z } from "../../../utils/common.js";
5
+ import w from "../../basic/nmorph-icon/NmorphIcon.vue.js";
6
+ /* empty css */
7
+ import ee from "../../../assets/icons/audio.svg.js";
8
+ import oe from "../../basic/nmorph-button/NmorphButton.vue.js";
9
+ /* empty css */
10
+ import ae from "../../../assets/icons/pause.svg.js";
11
+ import re from "../../../assets/icons/play.svg.js";
12
+ import te from "../../../assets/icons/open.svg.js";
13
+ import ne from "../../../assets/icons/download.svg.js";
14
+ import le from "../../../assets/icons/loading.svg.js";
15
+ const ie = ["src", "preload"], se = { class: "nmorph-audio-preview__icon" }, de = { class: "nmorph-audio-preview__body" }, ue = { class: "nmorph-audio-preview__header" }, ce = { class: "nmorph-audio-preview__name" }, pe = {
16
+ key: 0,
17
+ class: "nmorph-audio-preview__error"
18
+ }, me = {
19
+ key: 1,
20
+ class: "nmorph-audio-preview__time"
21
+ }, ve = ["disabled", "aria-label"], fe = {
22
+ key: 0,
23
+ class: "nmorph-audio-preview__actions"
24
+ }, _e = ["href", "aria-label"], he = ["href", "download", "aria-label"], Me = /* @__PURE__ */ q({
25
+ __name: "NmorphAudioPreview",
26
+ props: {
27
+ src: {},
28
+ name: { default: "" },
29
+ durationMs: { default: void 0 },
30
+ width: { default: void 0 },
31
+ compact: { type: Boolean, default: !1 },
32
+ preload: { default: "metadata" },
33
+ downloadHref: { default: "" },
34
+ loading: { type: Boolean, default: !1 },
35
+ error: { type: Boolean, default: !1 },
36
+ errorText: { default: "" },
37
+ showDefaultActions: { type: Boolean, default: !0 }
38
+ },
39
+ emits: ["play", "pause", "open", "download", "error"],
40
+ setup(S, { expose: T, emit: $ }) {
41
+ const e = S, u = $, x = G(), a = _(null), n = _(!1), v = _(0), f = _(e.durationMs ? e.durationMs / 1e3 : 0);
42
+ J(
43
+ () => e.durationMs,
44
+ (o) => {
45
+ f.value = o ? o / 1e3 : f.value;
46
+ }
47
+ );
48
+ const d = l(() => f.value || 0), g = l({
49
+ get: () => d.value > 0 ? v.value / d.value * 100 : 0,
50
+ set: (o) => {
51
+ !a.value || d.value <= 0 || (a.value.currentTime = o / 100 * d.value, v.value = a.value.currentTime);
52
+ }
53
+ }), B = l(() => ({ "--nmorph-audio-preview-progress": `${g.value}%` })), C = l(
54
+ () => !!x.actions || e.showDefaultActions && (e.src || e.downloadHref)
55
+ ), M = l(
56
+ () => Y({
57
+ "nmorph-audio-preview": [
58
+ e.compact && "compact",
59
+ e.loading && "loading",
60
+ e.error && "error",
61
+ n.value && "playing"
62
+ ]
63
+ })
64
+ ), z = l(
65
+ () => Z({
66
+ "--nmorph-audio-preview-width": e.width
67
+ })
68
+ ), k = (o) => {
69
+ if (!Number.isFinite(o) || o < 0) return "0:00";
70
+ const c = Math.floor(o), b = Math.floor(c / 60), j = c % 60;
71
+ return `${b}:${j.toString().padStart(2, "0")}`;
72
+ }, A = l(() => k(v.value)), D = l(() => k(d.value)), I = async () => {
73
+ if (!(!a.value || e.loading || e.error)) {
74
+ if (n.value) {
75
+ a.value.pause();
76
+ return;
77
+ }
78
+ try {
79
+ await a.value.play();
80
+ } catch {
81
+ n.value = !1;
82
+ }
83
+ }
84
+ }, P = () => {
85
+ !a.value || Number.isNaN(a.value.duration) || (f.value = a.value.duration);
86
+ }, V = () => {
87
+ v.value = a.value?.currentTime || 0;
88
+ }, E = (o) => {
89
+ n.value = !0, u("play", o);
90
+ }, L = (o) => {
91
+ n.value = !1, u("pause", o);
92
+ }, O = () => {
93
+ n.value = !1;
94
+ }, R = (o) => {
95
+ n.value = !1, u("error", o);
96
+ }, U = () => u("open"), F = () => u("download");
97
+ return T({ audioRef: a }), (o, c) => (t(), p("div", {
98
+ class: K(M.value),
99
+ style: N(z.value)
100
+ }, [
101
+ i("audio", {
102
+ ref_key: "audioRef",
103
+ ref: a,
104
+ src: e.src,
105
+ preload: e.preload,
106
+ onLoadedmetadata: P,
107
+ onTimeupdate: V,
108
+ onPlay: E,
109
+ onPause: L,
110
+ onEnded: O,
111
+ onError: R
112
+ }, null, 40, ie),
113
+ i("div", se, [
114
+ e.loading ? (t(), h(r(w), {
115
+ key: 0,
116
+ size: "medium"
117
+ }, {
118
+ default: m(() => [
119
+ s(r(le))
120
+ ]),
121
+ _: 1
122
+ })) : (t(), h(r(w), {
123
+ key: 1,
124
+ size: "medium"
125
+ }, {
126
+ default: m(() => [
127
+ s(r(ee))
128
+ ]),
129
+ _: 1
130
+ }))
131
+ ]),
132
+ s(r(oe), {
133
+ class: "nmorph-audio-preview__play",
134
+ height: "thin",
135
+ "style-type": "transparent",
136
+ disabled: e.loading || e.error,
137
+ onClick: I
138
+ }, {
139
+ "icon-only": m(() => [
140
+ n.value ? (t(), h(r(ae), { key: 0 })) : (t(), h(r(re), { key: 1 }))
141
+ ]),
142
+ _: 1
143
+ }, 8, ["disabled"]),
144
+ i("div", de, [
145
+ i("div", ue, [
146
+ i("span", ce, y(e.name || "Audio"), 1),
147
+ e.error && e.errorText ? (t(), p("span", pe, y(e.errorText), 1)) : (t(), p("span", me, y(A.value) + " / " + y(D.value), 1))
148
+ ]),
149
+ Q(i("input", {
150
+ "onUpdate:modelValue": c[0] || (c[0] = (b) => g.value = b),
151
+ class: "nmorph-audio-preview__range",
152
+ type: "range",
153
+ min: "0",
154
+ max: "100",
155
+ step: "0.1",
156
+ style: N(B.value),
157
+ disabled: e.loading || e.error || d.value <= 0,
158
+ "aria-label": `Audio progress ${e.name || ""}`
159
+ }, null, 12, ve), [
160
+ [
161
+ W,
162
+ g.value,
163
+ void 0,
164
+ { number: !0 }
165
+ ]
166
+ ])
167
+ ]),
168
+ C.value ? (t(), p("div", fe, [
169
+ X(o.$slots, "actions", {}, () => [
170
+ i("a", {
171
+ href: e.src,
172
+ target: "_blank",
173
+ rel: "noopener noreferrer",
174
+ class: "nmorph-audio-preview__action-link",
175
+ "aria-label": `Open ${e.name || "audio"}`,
176
+ onClick: U
177
+ }, [
178
+ s(r(w), { size: "small" }, {
179
+ default: m(() => [
180
+ s(r(te))
181
+ ]),
182
+ _: 1
183
+ })
184
+ ], 8, _e),
185
+ e.downloadHref ? (t(), p("a", {
186
+ key: 0,
187
+ href: e.downloadHref,
188
+ download: e.name,
189
+ class: "nmorph-audio-preview__action-link",
190
+ "aria-label": `Download ${e.name || "audio"}`,
191
+ onClick: F
192
+ }, [
193
+ s(r(w), { size: "small" }, {
194
+ default: m(() => [
195
+ s(r(ne))
196
+ ]),
197
+ _: 1
198
+ })
199
+ ], 8, he)) : H("", !0)
200
+ ])
201
+ ])) : H("", !0)
202
+ ], 6));
203
+ }
204
+ });
205
+ export {
206
+ Me as default
207
+ };
@@ -0,0 +1,6 @@
1
+ import './NmorphAudioPreview.css';
2
+ import o from "./NmorphAudioPreview.vue.js";
3
+ /* empty css */
4
+ export {
5
+ o as default
6
+ };
@@ -0,0 +1 @@
1
+ .nmorph-emoji-picker{--nmorph-emoji-picker-width: 300px;--nmorph-emoji-picker-height: 260px;--nmorph-emoji-picker-columns: 8;--nmorph-emoji-picker-cell-size: 32px;--nmorph-emoji-picker-toggle-size: 28px;--nmorph-emoji-picker-scrollbar-size: 6px;--nmorph-emoji-picker-hover-background: color-mix(in srgb, var(--nmorph-text-color) 8%, transparent);--nmorph-emoji-picker-active-background: color-mix(in srgb, var(--nmorph-text-color) 12%, var(--nmorph-main-color));--nmorph-emoji-picker-focus-ring: color-mix(in srgb, var(--nmorph-text-color) 24%, transparent);--nmorph-emoji-picker-toggle-inset: calc(var(--indentation-02) + 2px);--nmorph-emoji-picker-toggle-reserve: calc( var(--nmorph-emoji-picker-toggle-size) + var(--nmorph-emoji-picker-toggle-inset) + var(--indentation-02) );position:relative;box-sizing:border-box;width:min(100%,var(--nmorph-emoji-picker-width));min-width:0;color:var(--nmorph-text-color);font:inherit}.nmorph-emoji-picker .nmorph-emoji-picker__compact,.nmorph-emoji-picker .nmorph-emoji-picker__panel{box-sizing:border-box;width:100%;background:var(--nmorph-main-color);border-radius:var(--default-border-radius);box-shadow:var(--nmorph-shadow-inset)}.nmorph-emoji-picker .nmorph-emoji-picker__compact{display:flex;gap:var(--indentation-02);align-items:center;min-height:48px;padding:var(--indentation-02)}.nmorph-emoji-picker .nmorph-emoji-picker__quick-list{display:flex;flex:1 1 auto;gap:4px;min-width:0}.nmorph-emoji-picker .nmorph-emoji-picker__quick-button,.nmorph-emoji-picker .nmorph-emoji-picker__category,.nmorph-emoji-picker .nmorph-emoji-picker__emoji{margin:0;color:inherit;font:inherit;background:transparent;border:0;box-shadow:none;cursor:pointer;appearance:none}.nmorph-emoji-picker .nmorph-emoji-picker__quick-button:disabled,.nmorph-emoji-picker .nmorph-emoji-picker__category:disabled,.nmorph-emoji-picker .nmorph-emoji-picker__emoji:disabled{cursor:not-allowed;opacity:.5}.nmorph-emoji-picker .nmorph-emoji-picker__quick-button:focus,.nmorph-emoji-picker .nmorph-emoji-picker__category:focus,.nmorph-emoji-picker .nmorph-emoji-picker__emoji:focus{outline:none}.nmorph-emoji-picker .nmorph-emoji-picker__quick-button:focus-visible,.nmorph-emoji-picker .nmorph-emoji-picker__category:focus-visible,.nmorph-emoji-picker .nmorph-emoji-picker__emoji:focus-visible{box-shadow:var(--nmorph-shadow-inset),0 0 0 1px var(--nmorph-emoji-picker-focus-ring)}.nmorph-emoji-picker .nmorph-emoji-picker__quick-button,.nmorph-emoji-picker .nmorph-emoji-picker__emoji{display:inline-flex;flex:0 0 var(--nmorph-emoji-picker-cell-size);justify-content:center;align-items:center;width:var(--nmorph-emoji-picker-cell-size);height:var(--nmorph-emoji-picker-cell-size);padding:0;font-size:20px;line-height:1;border-radius:var(--default-border-radius)}.nmorph-emoji-picker .nmorph-emoji-picker__quick-button:hover:not(:disabled),.nmorph-emoji-picker .nmorph-emoji-picker__emoji:hover:not(:disabled){background:var(--nmorph-emoji-picker-hover-background)}.nmorph-emoji-picker .nmorph-emoji-picker__toggle-button{position:absolute;top:var(--nmorph-emoji-picker-toggle-inset);right:var(--nmorph-emoji-picker-toggle-inset);z-index:2;width:var(--nmorph-emoji-picker-toggle-size);min-width:var(--nmorph-emoji-picker-toggle-size);height:var(--nmorph-emoji-picker-toggle-size);min-height:var(--nmorph-emoji-picker-toggle-size);color:var(--nmorph-semi-contrast-text-color);--height: var(--nmorph-emoji-picker-toggle-size);--size: var(--nmorph-emoji-picker-toggle-size);--nmorph-selection-control-inline-padding: 0;--color: currentColor}.nmorph-emoji-picker .nmorph-emoji-picker__toggle-button .nmorph-checkbox__content,.nmorph-emoji-picker .nmorph-emoji-picker__toggle-button .nmorph-checkbox__fake{width:var(--nmorph-emoji-picker-toggle-size);min-width:var(--nmorph-emoji-picker-toggle-size);height:var(--nmorph-emoji-picker-toggle-size);min-height:var(--nmorph-emoji-picker-toggle-size)}.nmorph-emoji-picker .nmorph-emoji-picker__toggle-button .nmorph-checkbox__fake{padding:0;color:currentColor}.nmorph-emoji-picker .nmorph-emoji-picker__toggle-button .nmorph-icon{--color: currentColor}.nmorph-emoji-picker .nmorph-emoji-picker__toggle-button input:focus-visible{outline:none;opacity:0;scale:1}.nmorph-emoji-picker .nmorph-emoji-picker__toggle-button input:focus-visible+.nmorph-checkbox__fake{outline:1px solid var(--nmorph-emoji-picker-focus-ring);outline-offset:1px}.nmorph-emoji-picker .nmorph-emoji-picker__toggle-button:hover:not(.nmorph-checkbox--disabled){color:var(--nmorph-text-color);--color: var(--nmorph-text-color)}.nmorph-emoji-picker .nmorph-emoji-picker__toggle-button:hover:not(.nmorph-checkbox--disabled) .nmorph-icon{--color: var(--nmorph-text-color)}.nmorph-emoji-picker .nmorph-emoji-picker__button-label{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;white-space:nowrap;clip-path:inset(50%)}.nmorph-emoji-picker .nmorph-emoji-picker__panel{display:flex;flex-direction:column;height:var(--nmorph-emoji-picker-height);min-height:180px;max-height:min(60vh,var(--nmorph-emoji-picker-height));padding:var(--indentation-02);overflow:hidden}.nmorph-emoji-picker .nmorph-emoji-picker__toolbar{display:flex;flex:0 0 auto;gap:var(--indentation-02);align-items:center;min-width:0;padding:2px}.nmorph-emoji-picker.nmorph-emoji-picker--collapsible .nmorph-emoji-picker__compact,.nmorph-emoji-picker.nmorph-emoji-picker--collapsible .nmorph-emoji-picker__toolbar{padding-right:var(--nmorph-emoji-picker-toggle-reserve)}.nmorph-emoji-picker .nmorph-emoji-picker__search{flex:1 1 auto;min-width:0}.nmorph-emoji-picker .nmorph-emoji-picker__categories{display:flex;flex:0 0 auto;gap:4px;align-items:flex-start;min-width:0;margin:var(--indentation-02) 0;padding:0 2px}.nmorph-emoji-picker .nmorph-emoji-picker__categories .nmorph-scroll__bar--horizontal{right:2px;left:2px}.nmorph-emoji-picker .nmorph-emoji-picker__category{display:inline-flex;flex:0 0 auto;justify-content:center;align-items:center;max-width:120px;min-height:28px;padding:0 10px;overflow:hidden;color:var(--nmorph-semi-contrast-text-color);font-size:var(--font-size-extra-small);line-height:var(--line-height-regular);white-space:nowrap;text-overflow:ellipsis;border-radius:var(--default-border-radius)}.nmorph-emoji-picker .nmorph-emoji-picker__category:hover:not(:disabled){color:var(--nmorph-text-color);background:var(--nmorph-emoji-picker-hover-background)}.nmorph-emoji-picker .nmorph-emoji-picker__category.nmorph-emoji-picker__category--active{color:var(--nmorph-text-color);background:var(--nmorph-emoji-picker-active-background);box-shadow:var(--nmorph-shadow-inset)}.nmorph-emoji-picker .nmorph-emoji-picker__body{flex:1 1 auto;min-height:0}.nmorph-emoji-picker .nmorph-emoji-picker__body-content{box-sizing:border-box;min-height:100%;padding:2px}.nmorph-emoji-picker .nmorph-emoji-picker__section{display:grid;gap:4px}.nmorph-emoji-picker .nmorph-emoji-picker__section+.nmorph-emoji-picker__section{margin-top:var(--indentation-02)}.nmorph-emoji-picker .nmorph-emoji-picker__section-title{padding:0 4px;color:var(--nmorph-semi-contrast-text-color);font-weight:600;font-size:var(--font-size-extra-small);line-height:var(--line-height-regular)}.nmorph-emoji-picker .nmorph-emoji-picker__grid{display:grid;grid-template-columns:repeat(var(--nmorph-emoji-picker-columns),minmax(0,1fr));gap:2px}.nmorph-emoji-picker .nmorph-emoji-picker__emoji{width:100%;min-width:0}.nmorph-emoji-picker .nmorph-emoji-picker__emoji-symbol{display:block;line-height:1}.nmorph-emoji-picker .nmorph-emoji-picker__empty{display:grid;gap:var(--indentation-02);place-items:center;min-height:100%;padding:var(--indentation-04);color:var(--nmorph-semi-contrast-text-color);text-align:center;--color: currentColor}.nmorph-emoji-picker.nmorph-emoji-picker--disabled{opacity:.65}
@@ -0,0 +1,405 @@
1
+ import './NmorphEmojiPicker.css';
2
+ import { defineComponent as we, ref as S, computed as s, watch as Q, openBlock as c, createElementBlock as d, normalizeStyle as Se, normalizeClass as J, createBlock as le, unref as f, withModifiers as Ce, withCtx as v, createVNode as k, createElementVNode as L, toDisplayString as E, createCommentVNode as W, Fragment as O, renderList as $, nextTick as Ae } from "vue";
3
+ import { useModifiers as Ke } from "../../../utils/create-modifiers.js";
4
+ import { createCssSizeVariables as Me } from "../../../utils/common.js";
5
+ import Ne from "../../form/nmorph-checkbox/NmorphCheckbox.vue.js";
6
+ /* empty css */
7
+ import X from "../../basic/nmorph-icon/NmorphIcon.vue.js";
8
+ /* empty css */
9
+ import ze from "../../../assets/icons/burger.svg.js";
10
+ import Y from "../../basic/nmorph-scroll/NmorphScroll.vue.js";
11
+ /* empty css */
12
+ import Be from "../../form/nmorph-text-input/NmorphTextInput.vue.js";
13
+ /* empty css */
14
+ import Ie from "../../../assets/icons/search.svg.js";
15
+ import Oe from "../../../assets/icons/smile.svg.js";
16
+ const $e = ["lang"], Ve = { class: "nmorph-emoji-picker__button-label" }, qe = ["aria-label"], De = ["aria-label", "title", "disabled", "onClick"], Te = {
17
+ key: 2,
18
+ class: "nmorph-emoji-picker__panel"
19
+ }, Fe = { class: "nmorph-emoji-picker__toolbar" }, Re = ["aria-selected", "disabled", "onClick"], He = ["aria-label"], Pe = {
20
+ key: 0,
21
+ class: "nmorph-emoji-picker__section-title"
22
+ }, Ue = { class: "nmorph-emoji-picker__grid" }, Qe = ["aria-label", "title", "disabled", "onFocus", "onClick"], Je = { class: "nmorph-emoji-picker__emoji-symbol" }, We = {
23
+ key: 1,
24
+ class: "nmorph-emoji-picker__empty"
25
+ }, uo = /* @__PURE__ */ we({
26
+ __name: "NmorphEmojiPicker",
27
+ props: {
28
+ language: { default: "en" },
29
+ dataSource: { default: () => [] },
30
+ i18n: { default: () => ({}) },
31
+ quickList: { default: () => [] },
32
+ initialExpanded: { type: Boolean, default: !0 },
33
+ width: { default: "300px" },
34
+ height: { default: "260px" },
35
+ columns: { default: 8 },
36
+ disabled: { type: Boolean, default: !1 }
37
+ },
38
+ emits: ["select", "expand", "collapse"],
39
+ setup(ie, { emit: se }) {
40
+ const l = ie, V = se, q = S(""), b = S(l.initialExpanded), y = S(""), C = S(0), Z = S(null), ce = {
41
+ searchPlaceholder: "Search emoji",
42
+ searchLabel: "Search emoji",
43
+ quickLabel: "Frequent emoji",
44
+ expandLabel: "Open emoji picker",
45
+ collapseLabel: "Close emoji picker",
46
+ noResults: "No emoji found",
47
+ categoryLabel: "Emoji categories",
48
+ resultsLabel: "Emoji results"
49
+ }, _ = (e) => !!e && typeof e == "object" && !Array.isArray(e), G = (e) => e.trim().toLocaleLowerCase(l.language || void 0), g = (e, o) => {
50
+ for (const r of o) {
51
+ const t = e[r];
52
+ if (typeof t == "string" && t.trim()) return t.trim();
53
+ if (typeof t == "number") return String(t);
54
+ }
55
+ return "";
56
+ }, A = (e) => Array.isArray(e) ? e.flatMap(A) : typeof e == "string" ? e.trim() ? [e.trim()] : [] : typeof e == "number" ? [String(e)] : _(e) ? Object.values(e).flatMap(A) : [], K = (e, o, r) => {
57
+ for (const t of o) {
58
+ const n = e[t], a = typeof n == "number" ? n : Number(n);
59
+ if (Number.isFinite(a)) return a;
60
+ }
61
+ return r;
62
+ }, ee = (e, o) => {
63
+ for (const r of o) {
64
+ const t = e[r];
65
+ if (Array.isArray(t)) return t;
66
+ }
67
+ }, M = (e) => {
68
+ if (typeof e == "string") return e.trim();
69
+ if (!_(e)) return "";
70
+ const o = g(e, ["emoji", "native", "char", "unicode", "value"]);
71
+ if (o) return o;
72
+ const r = ee(e, ["skinToneVariants", "skins", "variants"])?.[0];
73
+ return M(r);
74
+ }, ue = (e) => !!M(e), pe = (e) => Array.isArray(e) ? e.map((o) => {
75
+ const r = M(o);
76
+ if (!r) return null;
77
+ if (typeof o == "string") return { emoji: r };
78
+ const t = _(o) ? o : {};
79
+ return {
80
+ emoji: r,
81
+ annotation: g(t, ["annotation", "label", "name", "description"]),
82
+ tags: A(t.tags || t.keywords || t.aliases || t.shortcodes),
83
+ tone: g(t, ["tone", "skinTone", "skin_tone"])
84
+ };
85
+ }).filter((o) => !!o) : [], de = (e, o, r) => {
86
+ if (!_(e))
87
+ return {
88
+ key: o,
89
+ label: o,
90
+ sort: r
91
+ };
92
+ const t = g(e, ["group", "category", "groupName", "categoryName"]) || o, n = g(e, ["groupLabel", "categoryLabel"]) || t, a = K(e, ["groupOrder", "categoryOrder"], Number(t));
93
+ return {
94
+ key: t,
95
+ label: n,
96
+ sort: Number.isFinite(a) ? a : r
97
+ };
98
+ }, me = (e, o, r, t, n) => {
99
+ const a = M(e);
100
+ if (!a) return null;
101
+ const i = _(e) ? e : {}, p = de(i, o, t), m = g(i, ["annotation", "label", "name", "description"]) || a, h = A(i.tags || i.keywords || i.aliases || i.shortcodes), z = K(i, ["order", "sortOrder", "sort_order", "index"], n), U = i.skinToneVariants || i.skins || i.variants, B = pe(U).filter((I) => I.emoji !== a), w = p.key || o, ne = p.label || r || w, Ee = G(
102
+ [a, m, ne, ...h, ...B.map((I) => I.annotation || I.emoji)].filter(Boolean).join(" ")
103
+ );
104
+ return {
105
+ key: `${w}-${z}-${a}`,
106
+ emoji: a,
107
+ annotation: m,
108
+ tags: h,
109
+ groupKey: w,
110
+ groupLabel: ne,
111
+ groupSort: p.sort,
112
+ order: z,
113
+ skinToneVariants: B,
114
+ searchText: Ee
115
+ };
116
+ }, D = (e) => {
117
+ if (!(!_(e) || ue(e)))
118
+ return ee(e, ["emojis", "items", "children", "data"]);
119
+ }, he = (e) => {
120
+ const o = [], r = (n, a = "emoji", i = a, p = 0, m = o.length) => {
121
+ const h = me(
122
+ n,
123
+ a,
124
+ i,
125
+ p,
126
+ m
127
+ );
128
+ h && o.push(h);
129
+ }, t = (n, a, i) => {
130
+ const p = D(n);
131
+ if (!p) {
132
+ r(n, "emoji", "emoji", 0, i);
133
+ return;
134
+ }
135
+ const m = _(n) ? n : {}, h = g(m, ["group", "category", "name", "label"]) || a, z = g(m, ["label", "name", "title", "groupLabel", "categoryLabel"]) || h, U = K(m, ["order", "groupOrder", "categoryOrder"], i);
136
+ p.forEach((B, w) => r(B, h, z, U, w));
137
+ };
138
+ if (Array.isArray(e))
139
+ e.forEach((n, a) => {
140
+ D(n) ? t(n, `group-${a + 1}`, a) : r(n, "emoji", "emoji", 0, a);
141
+ });
142
+ else if (_(e)) {
143
+ const n = D(e);
144
+ if (n) {
145
+ const a = g(e, ["group", "category", "name", "label"]) || "emoji", i = g(e, ["label", "name", "title", "groupLabel", "categoryLabel"]) || a, p = K(e, ["order", "groupOrder", "categoryOrder"], 0);
146
+ n.forEach((m, h) => r(m, a, i, p, h));
147
+ } else
148
+ Object.entries(e).forEach(([a, i], p) => {
149
+ Array.isArray(i) ? i.forEach((m, h) => r(m, a, a, p, h)) : t(i, a, p);
150
+ });
151
+ }
152
+ return o.sort((n, a) => n.groupSort !== a.groupSort ? n.groupSort - a.groupSort : n.order - a.order);
153
+ }, u = s(() => ({
154
+ ...ce,
155
+ ...l.i18n
156
+ })), oe = s(() => ({
157
+ ...l.i18n?.categories || {},
158
+ ...l.i18n?.categoryLabels || {}
159
+ })), j = s(() => he(l.dataSource)), be = s(() => {
160
+ const e = /* @__PURE__ */ new Map();
161
+ return j.value.forEach((o) => e.set(o.emoji, o.annotation || o.emoji)), e;
162
+ }), T = s(() => Array.from(new Set(l.quickList.map((e) => e.trim()).filter(Boolean)))), re = s(() => !b.value && T.value.length > 0), x = s(() => G(q.value)), N = s(() => {
163
+ const e = /* @__PURE__ */ new Map();
164
+ return j.value.forEach((o) => {
165
+ e.has(o.groupKey) || e.set(o.groupKey, {
166
+ key: o.groupKey,
167
+ label: oe.value[o.groupKey] || o.groupLabel,
168
+ sort: o.groupSort
169
+ });
170
+ }), Array.from(e.values()).sort((o, r) => o.sort - r.sort);
171
+ });
172
+ Q(
173
+ N,
174
+ (e) => {
175
+ if (!e.length) {
176
+ y.value = "";
177
+ return;
178
+ }
179
+ e.some((o) => o.key === y.value) || (y.value = e[0].key);
180
+ },
181
+ { immediate: !0 }
182
+ ), Q(
183
+ () => l.initialExpanded,
184
+ (e) => {
185
+ b.value = e;
186
+ }
187
+ ), Q([x, y], () => {
188
+ C.value = 0;
189
+ });
190
+ const fe = s(() => x.value ? j.value.filter((e) => e.searchText.includes(x.value)) : y.value ? j.value.filter((e) => e.groupKey === y.value) : j.value), F = s(() => {
191
+ const e = /* @__PURE__ */ new Map();
192
+ return fe.value.forEach((o) => {
193
+ const r = oe.value[o.groupKey] || o.groupLabel, t = e.get(o.groupKey) || {
194
+ key: o.groupKey,
195
+ label: r,
196
+ items: []
197
+ };
198
+ t.items.push(o), e.set(o.groupKey, t);
199
+ }), Array.from(e.values());
200
+ }), R = s(() => F.value.flatMap((e) => e.items)), ye = s(
201
+ () => N.value.find((e) => e.key === y.value)?.label || u.value.resultsLabel
202
+ ), ge = s(() => x.value ? u.value.resultsLabel : ye.value), H = s(() => !l.initialExpanded && T.value.length > 0), ke = s(
203
+ () => Ke({
204
+ "nmorph-emoji-picker": [
205
+ re.value && "compact",
206
+ b.value && "expanded",
207
+ H.value && "collapsible",
208
+ l.disabled && "disabled",
209
+ !j.value.length && "empty"
210
+ ]
211
+ })
212
+ ), _e = s(() => ({
213
+ ...Me({
214
+ "--nmorph-emoji-picker-width": l.width,
215
+ "--nmorph-emoji-picker-height": l.height
216
+ }),
217
+ "--nmorph-emoji-picker-columns": Math.max(1, Math.floor(l.columns))
218
+ })), te = (e) => be.value.get(e) || e, ae = (e) => {
219
+ l.disabled || V("select", e);
220
+ }, ve = () => {
221
+ l.disabled || (b.value = !0, V("expand"));
222
+ }, je = () => {
223
+ l.disabled || !H.value || (b.value = !1, V("collapse"));
224
+ }, xe = (e) => {
225
+ if (e) {
226
+ ve();
227
+ return;
228
+ }
229
+ je();
230
+ }, P = async (e) => {
231
+ const o = Z.value?.querySelectorAll(".nmorph-emoji-picker__emoji");
232
+ if (!o?.length) return;
233
+ const r = Math.min(Math.max(e, 0), o.length - 1);
234
+ C.value = r, await Ae(), o[r]?.focus();
235
+ }, Le = (e) => {
236
+ if (l.disabled || !R.value.length || e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) return;
237
+ const o = Math.max(1, Math.floor(l.columns)), r = R.value.length - 1, t = {
238
+ ArrowRight: 1,
239
+ ArrowLeft: -1,
240
+ ArrowDown: o,
241
+ ArrowUp: -o
242
+ };
243
+ e.key in t && (e.preventDefault(), P(C.value + t[e.key])), e.key === "Home" && (e.preventDefault(), P(0)), e.key === "End" && (e.preventDefault(), P(r));
244
+ };
245
+ return (e, o) => (c(), d("div", {
246
+ class: J(ke.value),
247
+ style: Se(_e.value),
248
+ lang: l.language
249
+ }, [
250
+ H.value ? (c(), le(f(Ne), {
251
+ key: 0,
252
+ class: J(["nmorph-emoji-picker__toggle-button nmorph-emoji-picker__expand-button", { "nmorph-emoji-picker__collapse-button": b.value }]),
253
+ design: "button",
254
+ "model-value": b.value,
255
+ "aria-label": b.value ? u.value.collapseLabel : u.value.expandLabel,
256
+ title: b.value ? u.value.collapseLabel : u.value.expandLabel,
257
+ disabled: l.disabled,
258
+ onClick: o[0] || (o[0] = Ce((r) => xe(!b.value), ["prevent"]))
259
+ }, {
260
+ label: v(() => [
261
+ k(f(X), { size: "small" }, {
262
+ default: v(() => [
263
+ k(f(ze))
264
+ ]),
265
+ _: 1
266
+ }),
267
+ L("span", Ve, E(b.value ? u.value.collapseLabel : u.value.expandLabel), 1)
268
+ ]),
269
+ _: 1
270
+ }, 8, ["class", "model-value", "aria-label", "title", "disabled"])) : W("", !0),
271
+ re.value ? (c(), d("div", {
272
+ key: 1,
273
+ class: "nmorph-emoji-picker__compact",
274
+ role: "group",
275
+ "aria-label": u.value.quickLabel
276
+ }, [
277
+ k(f(Y), {
278
+ class: "nmorph-emoji-picker__quick-list",
279
+ height: "calc(var(--nmorph-emoji-picker-cell-size) + var(--nmorph-emoji-picker-scrollbar-size))",
280
+ "max-height": "calc(var(--nmorph-emoji-picker-cell-size) + var(--nmorph-emoji-picker-scrollbar-size))",
281
+ "scroll-y-prop": "hidden",
282
+ "scroll-x-prop": "auto",
283
+ "css-scroll-behavior": "auto",
284
+ "x-bar-width-in-px": 6
285
+ }, {
286
+ default: v(() => [
287
+ (c(!0), d(O, null, $(T.value, (r) => (c(), d("button", {
288
+ key: r,
289
+ type: "button",
290
+ class: "nmorph-emoji-picker__quick-button",
291
+ "aria-label": te(r),
292
+ title: te(r),
293
+ disabled: l.disabled,
294
+ onClick: (t) => ae(r)
295
+ }, E(r), 9, De))), 128))
296
+ ]),
297
+ _: 1
298
+ })
299
+ ], 8, qe)) : (c(), d("div", Te, [
300
+ L("div", Fe, [
301
+ k(f(Be), {
302
+ modelValue: q.value,
303
+ "onUpdate:modelValue": o[1] || (o[1] = (r) => q.value = r),
304
+ class: "nmorph-emoji-picker__search",
305
+ placeholder: u.value.searchPlaceholder,
306
+ disabled: l.disabled,
307
+ "input-attrs": {
308
+ class: "nmorph-emoji-picker__search-input",
309
+ role: "searchbox",
310
+ "aria-label": u.value.searchLabel
311
+ }
312
+ }, {
313
+ "prepend-icon": v(() => [
314
+ k(f(X), { size: "small" }, {
315
+ default: v(() => [
316
+ k(f(Ie))
317
+ ]),
318
+ _: 1
319
+ })
320
+ ]),
321
+ _: 1
322
+ }, 8, ["modelValue", "placeholder", "disabled", "input-attrs"])
323
+ ]),
324
+ N.value.length && !x.value ? (c(), le(f(Y), {
325
+ key: 0,
326
+ class: "nmorph-emoji-picker__categories",
327
+ height: "40px",
328
+ "max-height": "40px",
329
+ "scroll-y-prop": "hidden",
330
+ "scroll-x-prop": "auto",
331
+ "css-scroll-behavior": "auto",
332
+ "x-bar-width-in-px": 6,
333
+ "x-gap-in-px": 6,
334
+ role: "tablist",
335
+ "aria-label": u.value.categoryLabel
336
+ }, {
337
+ default: v(() => [
338
+ (c(!0), d(O, null, $(N.value, (r) => (c(), d("button", {
339
+ key: r.key,
340
+ type: "button",
341
+ class: J(["nmorph-emoji-picker__category", { "nmorph-emoji-picker__category--active": r.key === y.value }]),
342
+ role: "tab",
343
+ "aria-selected": r.key === y.value,
344
+ disabled: l.disabled,
345
+ onClick: (t) => y.value = r.key
346
+ }, E(r.label), 11, Re))), 128))
347
+ ]),
348
+ _: 1
349
+ }, 8, ["aria-label"])) : W("", !0),
350
+ k(f(Y), {
351
+ class: "nmorph-emoji-picker__body",
352
+ height: "100%",
353
+ "max-height": "100%",
354
+ "scroll-x-prop": "hidden",
355
+ "scroll-y-prop": "auto",
356
+ "css-scroll-behavior": "auto",
357
+ "y-bar-width-in-px": 8
358
+ }, {
359
+ default: v(() => [
360
+ L("div", {
361
+ ref_key: "gridRef",
362
+ ref: Z,
363
+ class: "nmorph-emoji-picker__body-content",
364
+ "aria-label": ge.value,
365
+ onKeydown: Le
366
+ }, [
367
+ F.value.length ? (c(!0), d(O, { key: 0 }, $(F.value, (r) => (c(), d("section", {
368
+ key: r.key,
369
+ class: "nmorph-emoji-picker__section"
370
+ }, [
371
+ x.value ? (c(), d("div", Pe, E(r.label), 1)) : W("", !0),
372
+ L("div", Ue, [
373
+ (c(!0), d(O, null, $(r.items, (t) => (c(), d("button", {
374
+ key: t.key,
375
+ type: "button",
376
+ class: "nmorph-emoji-picker__emoji",
377
+ "aria-label": t.annotation,
378
+ title: t.annotation,
379
+ disabled: l.disabled,
380
+ onFocus: (n) => C.value = R.value.findIndex((a) => a.key === t.key),
381
+ onClick: (n) => ae(t.emoji)
382
+ }, [
383
+ L("span", Je, E(t.emoji), 1)
384
+ ], 40, Qe))), 128))
385
+ ])
386
+ ]))), 128)) : (c(), d("div", We, [
387
+ k(f(X), null, {
388
+ default: v(() => [
389
+ k(f(Oe))
390
+ ]),
391
+ _: 1
392
+ }),
393
+ L("span", null, E(u.value.noResults), 1)
394
+ ]))
395
+ ], 40, He)
396
+ ]),
397
+ _: 1
398
+ })
399
+ ]))
400
+ ], 14, $e));
401
+ }
402
+ });
403
+ export {
404
+ uo as default
405
+ };
@@ -0,0 +1,6 @@
1
+ import './NmorphEmojiPicker.css';
2
+ import o from "./NmorphEmojiPicker.vue.js";
3
+ /* empty css */
4
+ export {
5
+ o as default
6
+ };
@@ -0,0 +1 @@
1
+ .nmorph-file-card{display:flex;gap:var(--indentation-03);align-items:center;box-sizing:border-box;width:100%;min-width:0;max-width:100%;min-height:64px;padding:var(--indentation-03);color:var(--nmorph-text-color);background:var(--nmorph-main-color);border-radius:var(--default-border-radius);box-shadow:var(--nmorph-shadow-inset)}.nmorph-file-card .nmorph-file-card__icon{display:flex;flex:0 0 auto;justify-content:center;align-items:center;width:36px;height:36px;color:var(--nmorph-accent-color);background:color-mix(in srgb,var(--nmorph-accent-color) 12%,transparent);border-radius:var(--default-border-radius);--color: currentColor}.nmorph-file-card .nmorph-file-card__body{display:flex;flex:1 1 0;flex-direction:column;gap:2px;min-width:0}.nmorph-file-card .nmorph-file-card__name,.nmorph-file-card .nmorph-file-card__meta,.nmorph-file-card .nmorph-file-card__error{display:block;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.nmorph-file-card .nmorph-file-card__name{font-weight:600;font-size:var(--font-size-small);line-height:var(--line-height-regular)}.nmorph-file-card .nmorph-file-card__meta,.nmorph-file-card .nmorph-file-card__error{font-size:var(--font-size-extra-small);line-height:var(--line-height-regular)}.nmorph-file-card .nmorph-file-card__meta{color:var(--nmorph-semi-contrast-text-color)}.nmorph-file-card .nmorph-file-card__error{color:var(--nmorph-error-text-color)}.nmorph-file-card .nmorph-file-card__badge{flex:0 0 auto;max-width:72px;padding:2px 6px;overflow:hidden;color:var(--nmorph-accent-color);font-weight:700;font-size:var(--font-size-extra-small);line-height:var(--line-height-regular);white-space:nowrap;text-transform:uppercase;text-overflow:ellipsis;background:color-mix(in srgb,var(--nmorph-accent-color) 10%,transparent);border-radius:var(--default-border-radius)}.nmorph-file-card .nmorph-file-card__actions{display:flex;flex:0 0 auto;gap:var(--indentation-01);align-items:center}.nmorph-file-card .nmorph-file-card__action-link{display:inline-flex;justify-content:center;align-items:center;width:22px;height:22px;color:inherit;text-decoration:none;border-radius:var(--default-border-radius)}.nmorph-file-card .nmorph-file-card__action-link:hover{color:var(--nmorph-accent-color);background:color-mix(in srgb,var(--nmorph-accent-color) 10%,transparent)}.nmorph-file-card .nmorph-file-card__action-link .nmorph-icon{--color: currentColor}.nmorph-file-card.nmorph-file-card--compact{min-height:52px;padding:var(--indentation-02)}.nmorph-file-card.nmorph-file-card--compact .nmorph-file-card__icon{width:30px;height:30px}.nmorph-file-card.nmorph-file-card--error{outline:1px solid var(--nmorph-error-color)}