@fastkit/vui 0.7.46 → 0.7.49

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.
@@ -9,8 +9,8 @@ var vueUtils = require('@fastkit/vue-utils');
9
9
  var vueScroller = require('@fastkit/vue-scroller');
10
10
  var vueColorScheme = require('@fastkit/vue-color-scheme');
11
11
  var vueLoading = require('@fastkit/vue-loading');
12
- var iconFont = require('@fastkit/icon-font');
13
12
  var helpers = require('@fastkit/helpers');
13
+ var iconFont = require('@fastkit/icon-font');
14
14
  var vueAppLayout = require('@fastkit/vue-app-layout');
15
15
  var vueFormControl = require('@fastkit/vue-form-control');
16
16
  var vue3 = require('@tiptap/vue-3');
@@ -292,7 +292,7 @@ const VFormControl = vue.defineComponent({
292
292
  ctx.emit('clickLabel', ev, control);
293
293
  }
294
294
  }, [label, getRequiredChip(), hinttip && vue.createVNode(vueKit.VTooltip, {
295
- "top": true,
295
+ "y": "top",
296
296
  "openOnHover": _hinttipDelay !== 'click',
297
297
  "openDelay": typeof _hinttipDelay === 'number' ? _hinttipDelay : undefined
298
298
  }, {
@@ -409,6 +409,248 @@ function useElevation(props, opts = {}) {
409
409
  };
410
410
  }
411
411
 
412
+ function _isSlot$e(s) {
413
+ return typeof s === 'function' || Object.prototype.toString.call(s) === '[object Object]' && !vue.isVNode(s);
414
+ }
415
+
416
+ const VSkeltonLoaderBone = vue.defineComponent({
417
+ name: 'VSkeltonLoaderBone',
418
+ inheritAttrs: false,
419
+ props: {
420
+ tag: {
421
+ type: String,
422
+ default: 'div'
423
+ }
424
+ },
425
+
426
+ setup(props, ctx) {
427
+ return () => {
428
+ let _slot;
429
+
430
+ const TagName = props.tag;
431
+ return vue.createVNode(TagName, vue.mergeProps(ctx.attrs, {
432
+ "class": "v-skelton-loader-bone"
433
+ }), _isSlot$e(_slot = vueUtils.renderSlotOrEmpty(ctx.slots)) ? _slot : {
434
+ default: () => [_slot]
435
+ });
436
+ };
437
+ }
438
+
439
+ });
440
+
441
+ const IMAGE_ATTRS = ['alt', 'crossorigin', 'decoding', 'sizes', 'src', 'srcset', 'usemap'];
442
+ function splitAttrs(attrs) {
443
+ const el = { ...attrs
444
+ };
445
+ const img = {};
446
+
447
+ for (const ATTR of IMAGE_ATTRS) {
448
+ const value = attrs[ATTR];
449
+
450
+ if (value != null) {
451
+ img[ATTR] = value;
452
+ }
453
+ }
454
+
455
+ return {
456
+ el,
457
+ img
458
+ };
459
+ }
460
+ const NUMBERISH_PROP = [Number, String];
461
+ const DEFAULT_HEIGHT = 150;
462
+
463
+ const resolveBusyImageSizeValue = source => {
464
+ if (source == null) return;
465
+ return isNaN(source) ? String(source) : `${source}px`;
466
+ };
467
+ /**
468
+ * 画像表示用コンポーネント
469
+ * <img /> タグのように振る舞うが、ローディング表示や、表示サイズの調整など、ちょっといい感じにやるためのコンポーネント
470
+ */
471
+
472
+
473
+ const VBusyImage = vue.defineComponent({
474
+ name: 'VBusyImage',
475
+ props: { ...undefined,
476
+ aspectRatio: String,
477
+ width: NUMBERISH_PROP,
478
+ height: NUMBERISH_PROP,
479
+ cover: Boolean,
480
+ ...vueUtils.defineSlotsProps()
481
+ },
482
+ emits: {
483
+ load: ev => true,
484
+ error: ev => true
485
+ },
486
+
487
+ setup(props, ctx) {
488
+ const loadStateRef = vue.ref(props.cover && isAvairableSrc(ctx.attrs.src) ? 'loading' : 'pending');
489
+ const attrsRef = vue.computed(() => splitAttrs(ctx.attrs));
490
+ const isPendingRef = vue.computed(() => loadStateRef.value === 'pending');
491
+ const isLoadingRef = vue.computed(() => loadStateRef.value === 'loading');
492
+ const isLoadedRef = vue.computed(() => loadStateRef.value === 'loaded');
493
+ const isErrorRef = vue.computed(() => loadStateRef.value === 'error');
494
+ const classesRef = vue.computed(() => [`v-busy-image--${loadStateRef.value}`, {
495
+ 'v-busy-image--cover': props.cover,
496
+ 'v-busy-image--clickable': typeof ctx.attrs.onClick === 'function'
497
+ }]);
498
+ const nodeRef = vue.ref();
499
+ const coverImageRef = vue.ref();
500
+ const rectsRef = vue.computed(() => {
501
+ const placeholder = {};
502
+ const main = {};
503
+ const {
504
+ cover
505
+ } = props;
506
+ let {
507
+ width,
508
+ height
509
+ } = props;
510
+
511
+ if (height == null && cover) {
512
+ height = DEFAULT_HEIGHT;
513
+ }
514
+
515
+ if (width == null && cover) {
516
+ width = height;
517
+ }
518
+
519
+ width = resolveBusyImageSizeValue(width);
520
+ height = resolveBusyImageSizeValue(height);
521
+ main.width = width;
522
+ main.height = height;
523
+ placeholder.width = width;
524
+ placeholder.height = height;
525
+
526
+ if (placeholder.height == null) {
527
+ placeholder.height = resolveBusyImageSizeValue(DEFAULT_HEIGHT);
528
+ }
529
+
530
+ if (placeholder.width == null) {
531
+ placeholder.width = placeholder.height;
532
+ }
533
+
534
+ return {
535
+ placeholder,
536
+ main
537
+ };
538
+ });
539
+ const currentRectRef = vue.computed(() => isLoadedRef.value ? rectsRef.value.main : rectsRef.value.placeholder);
540
+ const stylesRef = vue.computed(() => {
541
+ const {
542
+ value: coverImage
543
+ } = coverImageRef;
544
+ const coverSrc = coverImage && coverImage.src;
545
+ const styles = { ...currentRectRef.value
546
+ };
547
+
548
+ if (coverSrc) {
549
+ styles.backgroundImage = `url(${coverSrc})`;
550
+ }
551
+
552
+ return styles;
553
+ });
554
+ let booted = false;
555
+ vue.watch(() => ctx.attrs.src, value => {
556
+ coverImageRef.value = undefined;
557
+
558
+ if (isAvairableSrc(value)) {
559
+ loadStateRef.value = 'loading';
560
+
561
+ if (props.cover) {
562
+ helpers.loadImage(value).then(image => {
563
+ coverImageRef.value = image;
564
+ setManualState('load');
565
+ }).catch(err => {
566
+ setManualState('error');
567
+ });
568
+ }
569
+ } else {
570
+ loadStateRef.value = 'pending';
571
+ }
572
+ }, {
573
+ immediate: helpers.IN_WINDOW
574
+ });
575
+
576
+ const setManualState = loadType => {
577
+ loadStateRef.value = loadType === 'load' ? 'loaded' : 'error';
578
+ const ev = new Event(loadType, {
579
+ bubbles: false,
580
+ cancelable: false,
581
+ composed: false
582
+ });
583
+ ctx.emit(loadType, ev);
584
+ };
585
+
586
+ vue.onMounted(() => {
587
+ if (booted || props.cover) return;
588
+ const image = nodeRef.value;
589
+ if (!image) return;
590
+ const loadType = imageIsReady(image);
591
+
592
+ if (loadType) {
593
+ setManualState(loadType);
594
+ }
595
+ });
596
+ vue.onBeforeUnmount(() => {
597
+ coverImageRef.value = undefined;
598
+ });
599
+
600
+ const handleLoad = ev => {
601
+ booted = true;
602
+ loadStateRef.value = 'loaded';
603
+ ctx.emit('load', ev);
604
+ };
605
+
606
+ const handleError = ev => {
607
+ booted = true;
608
+ loadStateRef.value = 'error';
609
+ ctx.emit('error', ev);
610
+ };
611
+
612
+ ctx.expose({
613
+ state: loadStateRef,
614
+ isPending: isPendingRef,
615
+ isLoading: isLoadingRef,
616
+ isLoaded: isLoadedRef,
617
+ isError: isErrorRef
618
+ });
619
+ return () => {
620
+ const {
621
+ el: elAttrs,
622
+ img: imgAttrs
623
+ } = attrsRef.value;
624
+ const styles = stylesRef.value;
625
+ const children = ctx.slots.default && ctx.slots.default();
626
+ return vue.createVNode("span", vue.mergeProps({
627
+ "class": ['v-busy-image', classesRef.value]
628
+ }, elAttrs, {
629
+ "style": styles
630
+ }), [!props.cover && vue.createVNode("img", vue.mergeProps({
631
+ "key": "img",
632
+ "ref": nodeRef,
633
+ "class": "v-busy-image__node"
634
+ }, imgAttrs, {
635
+ "onLoad": handleLoad,
636
+ "onError": handleError
637
+ }), null), !!children && vue.createVNode("span", {
638
+ "class": "v-busy-image__slot"
639
+ }, [children])]);
640
+ };
641
+ }
642
+
643
+ });
644
+
645
+ function imageIsReady(image) {
646
+ if (!image.complete) return false;
647
+ return image.naturalWidth + image.naturalHeight > 0 ? 'load' : 'error';
648
+ }
649
+
650
+ function isAvairableSrc(src) {
651
+ return typeof src === 'string' && src !== '';
652
+ }
653
+
412
654
  function extractRawGridValueClasses(value, prefix, getter) {
413
655
  if (typeof value !== 'object')
414
656
  return `${prefix}${getter ? getter(value) : value}`;
@@ -634,6 +876,162 @@ const VPaper = vue.defineComponent({
634
876
 
635
877
  });
636
878
 
879
+ const AVATAR_SIZES = ['sm', 'md', 'lg'];
880
+ function createAvatarProps() {
881
+ return { ...vueColorScheme.colorSchemeProps(),
882
+ ...vueUtils.navigationableInheritProps,
883
+ size: {
884
+ type: [String, Number],
885
+ default: 'md'
886
+ },
887
+ tile: Boolean,
888
+ rounded: Boolean,
889
+ disabled: Boolean,
890
+ src: String
891
+ };
892
+ }
893
+ const VAvatar = vue.defineComponent({
894
+ name: 'VAvatar',
895
+ inheritAttrs: false,
896
+ props: createAvatarProps(),
897
+
898
+ setup(props, ctx) {
899
+ const vui = useVui();
900
+ const defaults = vui.setting('buttonDefault');
901
+ const color = vueColorScheme.useColorClasses({
902
+ color: () => props.color || defaults.color,
903
+ variant: () => props.variant || defaults.variant
904
+ });
905
+ const navigationable = vueUtils.useNavigationable(ctx, {
906
+ clickableClassName: () => 'v-avatar--clickable',
907
+ linkFallbackTag: 'div'
908
+ });
909
+ const classes = vue.computed(() => {
910
+ const {
911
+ size
912
+ } = props;
913
+ return [{
914
+ 'v-avatar--tile': props.tile,
915
+ 'v-avatar--rounded': props.rounded
916
+ }, typeof size === 'string' && `v-avatar--${size}`];
917
+ });
918
+ const styles = vue.computed(() => {
919
+ const {
920
+ size
921
+ } = props;
922
+ if (typeof size !== 'number') return;
923
+ return {
924
+ '--avatar-size': `${size}px`
925
+ };
926
+ });
927
+ return () => {
928
+ const {
929
+ src
930
+ } = props;
931
+ const {
932
+ Tag,
933
+ attrs
934
+ } = navigationable.value;
935
+ return vue.createVNode(Tag, vue.mergeProps(attrs, {
936
+ "class": ['v-avatar', classes.value, color.colorClasses.value],
937
+ "style": styles.value
938
+ }), {
939
+ default: () => [!!src && vue.createVNode(VBusyImage, {
940
+ "class": "v-avatar__image",
941
+ "src": src,
942
+ "cover": true
943
+ }, null) || vueUtils.renderSlotOrEmpty(ctx.slots)]
944
+ });
945
+ };
946
+ }
947
+
948
+ });
949
+
950
+ const CHIP_SIZES = ['xs', 'sm', 'md', 'lg', 'xl'];
951
+ function createChipProps() {
952
+ return { ...vueColorScheme.colorSchemeProps(),
953
+ ...vueUtils.navigationableInheritProps,
954
+ size: {
955
+ type: String,
956
+ default: 'md'
957
+ },
958
+ startIcon: [String, Function],
959
+ endIcon: [String, Function],
960
+ label: Boolean,
961
+ disabled: Boolean
962
+ };
963
+ }
964
+
965
+ function resolveRawVChipIcon(raw, type) {
966
+ if (!raw) return;
967
+
968
+ if (typeof raw === 'function') {
969
+ return () => {
970
+ const child = raw();
971
+ if (child == null) return;
972
+ return vue.createVNode("span", {
973
+ "class": ['v-chip__icon', `v-chip__icon--${type}`]
974
+ }, [child]);
975
+ };
976
+ }
977
+
978
+ return () => vue.createVNode(VIcon, {
979
+ "class": ['v-chip__icon', `v-chip__icon--${type}`],
980
+ "name": raw
981
+ }, null);
982
+ }
983
+
984
+ const VChip = vue.defineComponent({
985
+ name: 'VChip',
986
+ inheritAttrs: false,
987
+ props: createChipProps(),
988
+
989
+ setup(props, ctx) {
990
+ const vui = useVui();
991
+ const defaults = vui.setting('buttonDefault');
992
+ const color = vueColorScheme.useColorClasses({
993
+ color: () => props.color || defaults.color,
994
+ variant: () => props.variant || defaults.variant
995
+ });
996
+ const startIcon = vue.computed(() => {
997
+ const _icon = resolveRawVChipIcon(props.startIcon, 'start');
998
+
999
+ return _icon && _icon();
1000
+ });
1001
+ const endIcon = vue.computed(() => {
1002
+ const _icon = resolveRawVChipIcon(props.endIcon, 'end');
1003
+
1004
+ return _icon && _icon();
1005
+ });
1006
+ const navigationable = vueUtils.useNavigationable(ctx, {
1007
+ clickableClassName: () => 'v-chip--clickable',
1008
+ linkFallbackTag: 'div'
1009
+ });
1010
+ const classes = vue.computed(() => {
1011
+ const {
1012
+ size
1013
+ } = props;
1014
+ return [{
1015
+ 'v-chip--label': props.label
1016
+ }, typeof size === 'string' && `v-chip--${size}`];
1017
+ });
1018
+ return () => {
1019
+ const {
1020
+ Tag,
1021
+ attrs
1022
+ } = navigationable.value;
1023
+ return vue.createVNode(Tag, vue.mergeProps(attrs, {
1024
+ "class": ['v-chip', classes.value, color.colorClasses.value]
1025
+ }), {
1026
+ default: () => [startIcon.value, vue.createVNode("span", {
1027
+ "class": "v-chip__content"
1028
+ }, [vueUtils.renderSlotOrEmpty(ctx.slots)]), endIcon.value]
1029
+ });
1030
+ };
1031
+ }
1032
+
1033
+ });
1034
+
637
1035
  function createCardProps() {
638
1036
  return { ...createPaperProps(),
639
1037
  ...vueUtils.navigationableInheritProps,
@@ -2424,7 +2822,10 @@ const VWysiwygEditor = vue.defineComponent({
2424
2822
 
2425
2823
  vue.watch(() => inputControl.canOperation, updateEditable);
2426
2824
  vue.watch(() => props.modelValue, modelValue => {
2427
- editor.value && editor.value.commands.setContent(modelValue == null ? '' : modelValue);
2825
+ const $editor = editor.value;
2826
+ if (!$editor) return;
2827
+ $editor.commands.setContent(modelValue == null ? '' : modelValue);
2828
+ textRef.value = $editor.getText();
2428
2829
  });
2429
2830
  const editor = vue3.useEditor({
2430
2831
  onCreate: ({
@@ -2442,6 +2843,7 @@ const VWysiwygEditor = vue.defineComponent({
2442
2843
  onUpdate: ev => {
2443
2844
  inputControl.value = ev.editor.getHTML();
2444
2845
  textRef.value = ev.editor.getText();
2846
+ console.log(textRef.value);
2445
2847
  },
2446
2848
  autofocus: props.autofocus,
2447
2849
  content: props.modelValue,
@@ -4520,11 +4922,15 @@ exports.VMenu = vueKit.VMenu;
4520
4922
  exports.VSnackbar = vueKit.VSnackbar;
4521
4923
  exports.VTooltip = vueKit.VTooltip;
4522
4924
  exports.ICON_NAMES = iconFont.ICON_NAMES;
4925
+ exports.AVATAR_SIZES = AVATAR_SIZES;
4926
+ exports.CHIP_SIZES = CHIP_SIZES;
4523
4927
  exports.CONTROL_FIELD_VARIANTS = CONTROL_FIELD_VARIANTS;
4524
4928
  exports.CONTROL_SIZES = CONTROL_SIZES;
4525
4929
  exports.PAGINATION_ALIGNS = PAGINATION_ALIGNS;
4526
4930
  exports.VApp = VApp;
4931
+ exports.VAvatar = VAvatar;
4527
4932
  exports.VBreadcrumbs = VBreadcrumbs;
4933
+ exports.VBusyImage = VBusyImage;
4528
4934
  exports.VButton = VButton;
4529
4935
  exports.VButtonGroup = VButtonGroup;
4530
4936
  exports.VCard = VCard;
@@ -4532,6 +4938,7 @@ exports.VCardActions = VCardActions;
4532
4938
  exports.VCardContent = VCardContent;
4533
4939
  exports.VCheckbox = VCheckbox;
4534
4940
  exports.VCheckboxGroup = VCheckboxGroup;
4941
+ exports.VChip = VChip;
4535
4942
  exports.VContentSwitcher = VContentSwitcher;
4536
4943
  exports.VDataTable = VDataTable;
4537
4944
  exports.VDrawerLayout = VDrawerLayout;
@@ -4551,6 +4958,7 @@ exports.VPaper = VPaper;
4551
4958
  exports.VRadio = VRadio;
4552
4959
  exports.VRadioGroup = VRadioGroup;
4553
4960
  exports.VSelect = VSelect;
4961
+ exports.VSkeltonLoaderBone = VSkeltonLoaderBone;
4554
4962
  exports.VSwitch = VSwitch;
4555
4963
  exports.VSwitchGroup = VSwitchGroup;
4556
4964
  exports.VTabs = VTabs;
@@ -4588,7 +4996,9 @@ exports.WysiwygLinkTool = WysiwygLinkTool;
4588
4996
  exports.WysiwygOrderedListTool = WysiwygOrderedListTool;
4589
4997
  exports.WysiwygTextColorTool = WysiwygTextColorTool;
4590
4998
  exports.configureDataTableDefaults = configureDataTableDefaults;
4999
+ exports.createAvatarProps = createAvatarProps;
4591
5000
  exports.createCardProps = createCardProps;
5001
+ exports.createChipProps = createChipProps;
4592
5002
  exports.createControlFieldProviderProps = createControlFieldProviderProps;
4593
5003
  exports.createControlProps = createControlProps;
4594
5004
  exports.createElevationProps = createElevationProps;
@@ -4611,6 +5021,7 @@ exports.renderNavigationItemInput = renderNavigationItemInput;
4611
5021
  exports.resolveNavigationItemInput = resolveNavigationItemInput;
4612
5022
  exports.resolveRawIconProp = resolveRawIconProp;
4613
5023
  exports.resolveRawWysiwygEditorTools = resolveRawWysiwygEditorTools;
5024
+ exports.splitAttrs = splitAttrs;
4614
5025
  exports.useControl = useControl;
4615
5026
  exports.useControlField = useControlField;
4616
5027
  exports.useElevation = useElevation;