@retailcrm/embed-ui-v1-components 0.9.13 → 0.9.15

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 (74) hide show
  1. package/AGENTS.md +126 -0
  2. package/README.md +24 -0
  3. package/assets/stylesheets/palette.less +11 -6
  4. package/bin/embed-ui-v1-components.mjs +209 -0
  5. package/bin/postinstall.mjs +37 -0
  6. package/dist/host.cjs +1900 -590
  7. package/dist/host.css +659 -6
  8. package/dist/host.d.ts +2374 -50
  9. package/dist/host.js +1901 -591
  10. package/dist/remote.cjs +610 -33
  11. package/dist/remote.d.ts +729 -48
  12. package/dist/remote.js +612 -35
  13. package/docs/AI.md +106 -0
  14. package/docs/COMPONENTS.md +96 -0
  15. package/docs/FORMAT.md +248 -0
  16. package/docs/PROFILES.md +64 -0
  17. package/docs/README.md +65 -0
  18. package/docs/STYLING.md +156 -0
  19. package/docs/profiles/UiAddButton.yml +45 -0
  20. package/docs/profiles/UiAlert.yml +36 -0
  21. package/docs/profiles/UiAvatar.yml +36 -0
  22. package/docs/profiles/UiAvatarList.yml +30 -0
  23. package/docs/profiles/UiButton.yml +221 -0
  24. package/docs/profiles/UiCalendar.yml +36 -0
  25. package/docs/profiles/UiCheckbox.yml +41 -0
  26. package/docs/profiles/UiCollapse.yml +28 -0
  27. package/docs/profiles/UiCollapseBox.yml +39 -0
  28. package/docs/profiles/UiCollapseGroup.yml +27 -0
  29. package/docs/profiles/UiCopyButton.yml +40 -0
  30. package/docs/profiles/UiDate.yml +26 -0
  31. package/docs/profiles/UiDatePicker.yml +47 -0
  32. package/docs/profiles/UiError.yml +20 -0
  33. package/docs/profiles/UiField.yml +229 -0
  34. package/docs/profiles/UiImage.yml +27 -0
  35. package/docs/profiles/UiInfobox.yml +33 -0
  36. package/docs/profiles/UiLink.yml +39 -0
  37. package/docs/profiles/UiLoader.yml +26 -0
  38. package/docs/profiles/UiMenuItem.yml +45 -0
  39. package/docs/profiles/UiMenuItemGroup.yml +38 -0
  40. package/docs/profiles/UiModalSidebar.yml +34 -0
  41. package/docs/profiles/UiModalWindow.yml +32 -0
  42. package/docs/profiles/UiModalWindowSurface.yml +29 -0
  43. package/docs/profiles/UiNumberStepper.yml +40 -0
  44. package/docs/profiles/UiPageHeader.yml +240 -0
  45. package/docs/profiles/UiPopper.yml +197 -0
  46. package/docs/profiles/UiPopperConnector.yml +109 -0
  47. package/docs/profiles/UiPopperTarget.yml +112 -0
  48. package/docs/profiles/UiRadio.yml +26 -0
  49. package/docs/profiles/UiRadioSwitch.yml +224 -0
  50. package/docs/profiles/UiRadioSwitchOption.yml +113 -0
  51. package/docs/profiles/UiScrollBox.yml +19 -0
  52. package/docs/profiles/UiSelect.yml +318 -0
  53. package/docs/profiles/UiSelectOption.yml +32 -0
  54. package/docs/profiles/UiSelectOptionGroup.yml +26 -0
  55. package/docs/profiles/UiSlider.yml +26 -0
  56. package/docs/profiles/UiSwitch.yml +25 -0
  57. package/docs/profiles/UiTab.yml +114 -0
  58. package/docs/profiles/UiTabGroup.yml +233 -0
  59. package/docs/profiles/UiTable.yml +148 -0
  60. package/docs/profiles/UiTableBodyCell.yml +35 -0
  61. package/docs/profiles/UiTableColumn.yml +38 -0
  62. package/docs/profiles/UiTableFooterButton.yml +32 -0
  63. package/docs/profiles/UiTableFooterSection.yml +26 -0
  64. package/docs/profiles/UiTableHeadCell.yml +32 -0
  65. package/docs/profiles/UiTableSorter.yml +33 -0
  66. package/docs/profiles/UiTag.yml +29 -0
  67. package/docs/profiles/UiTextbox.yml +388 -0
  68. package/docs/profiles/UiTimePicker.yml +34 -0
  69. package/docs/profiles/UiToolbarButton.yml +25 -0
  70. package/docs/profiles/UiToolbarLink.yml +20 -0
  71. package/docs/profiles/UiTooltip.yml +31 -0
  72. package/docs/profiles/UiTransition.yml +15 -0
  73. package/docs/profiles/UiYandexMap.yml +17 -0
  74. package/package.json +11 -2
package/dist/remote.cjs CHANGED
@@ -124,13 +124,13 @@ const UiError = remote.defineRemoteComponent(
124
124
  UiErrorType,
125
125
  ["click", "focus", "blur"]
126
126
  );
127
- const _hoisted_1$5 = {
127
+ const _hoisted_1$7 = {
128
128
  xmlns: "http://www.w3.org/2000/svg",
129
129
  fill: "currentColor",
130
130
  viewBox: "0 0 24 24"
131
131
  };
132
132
  function render$2(_ctx, _cache) {
133
- return vue.openBlock(), vue.createElementBlock("svg", _hoisted_1$5, [..._cache[0] || (_cache[0] = [
133
+ return vue.openBlock(), vue.createElementBlock("svg", _hoisted_1$7, [..._cache[0] || (_cache[0] = [
134
134
  vue.createElementVNode("path", {
135
135
  "fill-rule": "evenodd",
136
136
  d: "M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10A10 10 0 0 0 12 2m1 15.5a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5zm.88-5.21a2.89 2.89 0 0 0 2-2.73V9A2.88 2.88 0 0 0 13 6.12h-2A2.88 2.88 0 0 0 8.12 9v.5a.5.5 0 0 0 .5.5h.76a.5.5 0 0 0 .5-.5V9c0-.619.501-1.12 1.12-1.12h2A1.12 1.12 0 0 1 14.16 9v.56a1.13 1.13 0 0 1-.76 1.07l-.95.31a1.88 1.88 0 0 0-1.29 1.78v.78a.5.5 0 0 0 .5.5h.76a.5.5 0 0 0 .5-.5v-.78c0-.053.032-.1.08-.12z",
@@ -147,23 +147,23 @@ const UiPopperTargetType = "UiPopperTarget";
147
147
  const UiPopperTarget = remote.defineRemoteComponent(UiPopperTargetType);
148
148
  const UiTooltipType = "UiTooltip";
149
149
  const UiTooltip = remote.defineRemoteComponent(UiTooltipType);
150
- const _hoisted_1$4 = { class: "ui-v1-field__headline" };
151
- const _hoisted_2$1 = ["id", "for"];
152
- const _hoisted_3$1 = {
150
+ const _hoisted_1$6 = { class: "ui-v1-field__headline" };
151
+ const _hoisted_2$3 = ["id", "for"];
152
+ const _hoisted_3$3 = {
153
153
  key: 0,
154
154
  class: "ui-v1-field__required-mark",
155
155
  "aria-hidden": "true"
156
156
  };
157
- const _hoisted_4 = {
157
+ const _hoisted_4$1 = {
158
158
  key: 1,
159
159
  class: "ui-v1-field__hint"
160
160
  };
161
- const _hoisted_5 = {
161
+ const _hoisted_5$1 = {
162
162
  key: 2,
163
163
  class: "ui-v1-field__addon"
164
164
  };
165
165
  const _hoisted_6 = { class: "ui-v1-field__control" };
166
- const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
166
+ const _sfc_main$9 = /* @__PURE__ */ vue.defineComponent({
167
167
  ...{
168
168
  inheritAttrs: false
169
169
  },
@@ -221,7 +221,7 @@ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
221
221
  "ui-v1-field_readonly": __props.readonly
222
222
  }
223
223
  }, _ctx.$attrs), [
224
- vue.createElementVNode("div", _hoisted_1$4, [
224
+ vue.createElementVNode("div", _hoisted_1$6, [
225
225
  __props.label || _ctx.$slots.label ? (vue.openBlock(), vue.createElementBlock("label", {
226
226
  key: 0,
227
227
  id: `${__props.id}-label`,
@@ -231,9 +231,9 @@ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
231
231
  vue.renderSlot(_ctx.$slots, "label", {}, () => [
232
232
  vue.createTextVNode(vue.toDisplayString(__props.label), 1)
233
233
  ]),
234
- __props.required ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$1, " * ")) : vue.createCommentVNode("", true)
235
- ], 8, _hoisted_2$1)) : vue.createCommentVNode("", true),
236
- __props.hint || _ctx.$slots.hint ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_4, [
234
+ __props.required ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$3, " * ")) : vue.createCommentVNode("", true)
235
+ ], 8, _hoisted_2$3)) : vue.createCommentVNode("", true),
236
+ __props.hint || _ctx.$slots.hint ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_4$1, [
237
237
  vue.createVNode(vue.unref(UiPopperConnector), null, {
238
238
  default: vue.withCtx(() => [
239
239
  vue.createVNode(vue.unref(UiPopperTarget), {
@@ -271,7 +271,7 @@ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
271
271
  _: 3
272
272
  })
273
273
  ])) : vue.createCommentVNode("", true),
274
- _ctx.$slots.addon ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_5, [
274
+ _ctx.$slots.addon ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_5$1, [
275
275
  vue.renderSlot(_ctx.$slots, "addon")
276
276
  ])) : vue.createCommentVNode("", true)
277
277
  ]),
@@ -389,11 +389,566 @@ const UiNumberStepper = remote.defineRemoteComponent(
389
389
  "violation"
390
390
  ]
391
391
  );
392
+ const events$1 = [
393
+ "blur",
394
+ "change",
395
+ "focus",
396
+ "keydown",
397
+ "update:value"
398
+ ];
399
+ const UiPageHeaderTitleType = "UiPageHeaderTitle";
400
+ const UiPageHeaderTitle = remote.defineRemoteComponent(UiPageHeaderTitleType, {
401
+ emits: events$1,
402
+ methods: {
403
+ focus: remote.defineRemoteMethod(),
404
+ blur: remote.defineRemoteMethod()
405
+ }
406
+ });
407
+ const _hoisted_1$5 = { class: "ui-v1-page-header__main" };
408
+ const _hoisted_2$2 = {
409
+ key: 0,
410
+ class: "ui-v1-page-header__addon"
411
+ };
412
+ const _hoisted_3$2 = {
413
+ key: 0,
414
+ class: "ui-v1-page-header__actions"
415
+ };
416
+ const _sfc_main$8 = /* @__PURE__ */ vue.defineComponent({
417
+ ...{
418
+ inheritAttrs: false
419
+ },
420
+ __name: "UiPageHeader",
421
+ props: {
422
+ /** Уникальный идентификатор корневого элемента */
423
+ id: {
424
+ type: null,
425
+ default: void 0
426
+ },
427
+ /** Текст заголовка */
428
+ value: {
429
+ type: null,
430
+ default: ""
431
+ },
432
+ /** Плейсхолдер, отображаемый при отсутствии текста */
433
+ placeholder: {
434
+ type: String,
435
+ default: ""
436
+ },
437
+ /** Текст ошибки для tooltip при пустом невалидном заголовке */
438
+ error: {
439
+ type: String,
440
+ default: ""
441
+ },
442
+ /** Разрешает перейти в режим редактирования по клику */
443
+ editable: {
444
+ type: Boolean,
445
+ default: false
446
+ },
447
+ /** Автоматически переводит фокус во встроенный UiTextbox при входе в режим редактирования */
448
+ autofocus: {
449
+ type: Boolean,
450
+ default: false
451
+ },
452
+ /** Автоматически выделяет текст заголовка при фокусе на встроенном поле */
453
+ autoselect: {
454
+ type: Boolean,
455
+ default: true
456
+ },
457
+ /** Делает встроенное поле только для чтения */
458
+ readonly: {
459
+ type: Boolean,
460
+ default: false
461
+ },
462
+ /** Полностью отключает заголовок */
463
+ disabled: {
464
+ type: Boolean,
465
+ default: false
466
+ },
467
+ /** Помечает встроенное поле как невалидное */
468
+ invalid: {
469
+ type: Boolean,
470
+ default: false
471
+ }
472
+ },
473
+ emits: ["blur", "change", "focus", "keydown", "update:value"],
474
+ setup(__props, { expose: __expose, emit: __emit }) {
475
+ const props = __props;
476
+ const emit = __emit;
477
+ const header = vue.useTemplateRef("header");
478
+ const valueState = vue.ref(props.value === null ? "" : String(props.value));
479
+ const displayInvalid = vue.computed(() => props.invalid && valueState.value === "");
480
+ vue.watch(() => props.value, (nextValue) => {
481
+ valueState.value = nextValue === null ? "" : String(nextValue);
482
+ });
483
+ const onUpdateValue = (value) => {
484
+ valueState.value = String(value);
485
+ emit("update:value", value);
486
+ };
487
+ __expose({
488
+ focus: () => header.value?.focus(),
489
+ blur: () => header.value?.blur()
490
+ });
491
+ return (_ctx, _cache) => {
492
+ return vue.openBlock(), vue.createElementBlock("div", vue.mergeProps({
493
+ class: {
494
+ "ui-v1-page-header": true,
495
+ "ui-v1-page-header_disabled": __props.disabled,
496
+ "ui-v1-page-header_invalid": displayInvalid.value,
497
+ "ui-v1-page-header_readonly": __props.readonly
498
+ }
499
+ }, _ctx.$attrs), [
500
+ vue.createElementVNode("div", _hoisted_1$5, [
501
+ vue.createVNode(vue.unref(UiPopperConnector), null, {
502
+ default: vue.withCtx(() => [
503
+ vue.createVNode(vue.unref(UiPopperTarget), {
504
+ tag: "div",
505
+ class: "ui-v1-page-header__title"
506
+ }, {
507
+ default: vue.withCtx(() => [
508
+ vue.createVNode(vue.unref(UiPageHeaderTitle), {
509
+ id: __props.id,
510
+ ref_key: "header",
511
+ ref: header,
512
+ value: valueState.value,
513
+ placeholder: __props.placeholder,
514
+ error: __props.error,
515
+ invalid: __props.invalid,
516
+ editable: __props.editable,
517
+ autofocus: __props.autofocus,
518
+ autoselect: __props.autoselect,
519
+ readonly: __props.readonly,
520
+ disabled: __props.disabled,
521
+ onBlur: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("blur", $event)),
522
+ onChange: _cache[1] || (_cache[1] = ($event) => _ctx.$emit("change", $event)),
523
+ onFocus: _cache[2] || (_cache[2] = ($event) => _ctx.$emit("focus", $event)),
524
+ onKeydown: _cache[3] || (_cache[3] = ($event) => _ctx.$emit("keydown", $event)),
525
+ "onUpdate:value": onUpdateValue
526
+ }, null, 8, ["id", "value", "placeholder", "error", "invalid", "editable", "autofocus", "autoselect", "readonly", "disabled"])
527
+ ]),
528
+ _: 1
529
+ }),
530
+ displayInvalid.value && __props.error ? (vue.openBlock(), vue.createBlock(vue.unref(UiTooltip), {
531
+ key: 0,
532
+ "target-triggers": {
533
+ hide: [""]
534
+ },
535
+ "offset-main-axis": 8,
536
+ visible: "",
537
+ placement: "right"
538
+ }, {
539
+ default: vue.withCtx(() => [
540
+ vue.createTextVNode(vue.toDisplayString(__props.error), 1)
541
+ ]),
542
+ _: 1
543
+ })) : vue.createCommentVNode("", true)
544
+ ]),
545
+ _: 1
546
+ }),
547
+ _ctx.$slots.addon ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$2, [
548
+ vue.renderSlot(_ctx.$slots, "addon")
549
+ ])) : vue.createCommentVNode("", true)
550
+ ]),
551
+ _ctx.$slots.actions ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$2, [
552
+ vue.renderSlot(_ctx.$slots, "actions")
553
+ ])) : vue.createCommentVNode("", true)
554
+ ], 16);
555
+ };
556
+ }
557
+ });
392
558
  const UiRadioType = "UiRadio";
393
559
  const UiRadio = remote.defineRemoteComponent(
394
560
  UiRadioType,
395
561
  ["click", "focus", "blur"]
396
562
  );
563
+ const _hoisted_1$4 = {
564
+ xmlns: "http://www.w3.org/2000/svg",
565
+ viewBox: "0 0 24 24"
566
+ };
567
+ function render$1(_ctx, _cache) {
568
+ return vue.openBlock(), vue.createElementBlock("svg", _hoisted_1$4, [..._cache[0] || (_cache[0] = [
569
+ vue.createElementVNode("path", {
570
+ fill: "currentColor",
571
+ "fill-rule": "evenodd",
572
+ d: "M2 12C2 6.477 6.477 2 12 2A10 10 0 1 1 2 12m8.73 3.35 5.62-5.62a.5.5 0 0 0 0-.69l-.53-.53a.5.5 0 0 0-.7 0l-4.74 4.74-1.5-1.49a.48.48 0 0 0-.7 0l-.53.53a.5.5 0 0 0 0 .71l2.38 2.35a.48.48 0 0 0 .7 0",
573
+ "clip-rule": "evenodd"
574
+ }, null, -1)
575
+ ])]);
576
+ }
577
+ const IconCheckmarkCircle = { render: render$1 };
578
+ var APPEARANCE = /* @__PURE__ */ ((APPEARANCE2) => {
579
+ APPEARANCE2["DEFAULT"] = "default";
580
+ APPEARANCE2["SECTION"] = "section";
581
+ return APPEARANCE2;
582
+ })(APPEARANCE || {});
583
+ var SIZE$2 = /* @__PURE__ */ ((SIZE2) => {
584
+ SIZE2["SM"] = "sm";
585
+ SIZE2["MD"] = "md";
586
+ SIZE2["LG"] = "lg";
587
+ return SIZE2;
588
+ })(SIZE$2 || {});
589
+ const AppearanceKey = Symbol("UiRadioSwitchAppearance");
590
+ const SizeKey = Symbol("UiRadioSwitchSize");
591
+ const RegistryKey = Symbol("UiRadioSwitchRegistry");
592
+ const UpdateKey = Symbol("UiRadioSwitchUpdate");
593
+ const FocusableIdKey = Symbol("UiRadioSwitchFocusableId");
594
+ const SetFocusableIdKey = Symbol("UiRadioSwitchSetFocusableId");
595
+ const MoveFocusKey = Symbol("UiRadioSwitchMoveFocus");
596
+ const useAppearance = () => vue.inject(AppearanceKey, vue.computed(() => APPEARANCE.DEFAULT));
597
+ const useSize = () => vue.inject(SizeKey, vue.computed(() => SIZE$2.MD));
598
+ const useRegistry = () => vue.inject(RegistryKey, {
599
+ register: () => {
600
+ },
601
+ unregister: () => {
602
+ }
603
+ });
604
+ const useUpdate = () => vue.inject(UpdateKey, () => {
605
+ });
606
+ const useFocusableId = () => vue.inject(FocusableIdKey, vue.computed(() => null));
607
+ const useSetFocusableId = () => vue.inject(SetFocusableIdKey, () => {
608
+ });
609
+ const useMoveFocus = () => vue.inject(MoveFocusKey, () => {
610
+ });
611
+ const UiRadioSwitchRootType = "UiRadioSwitchRoot";
612
+ const UiRadioSwitchRoot = remote.defineRemoteComponent(UiRadioSwitchRootType);
613
+ const UiRadioSwitchOptionShellType = "UiRadioSwitchOptionShell";
614
+ const UiRadioSwitchOptionShell = remote.defineRemoteComponent(UiRadioSwitchOptionShellType, {
615
+ emits: [
616
+ "click",
617
+ "focus",
618
+ "blur",
619
+ "keydown"
620
+ ],
621
+ methods: {
622
+ focus: remote.defineRemoteMethod(),
623
+ blur: remote.defineRemoteMethod()
624
+ }
625
+ });
626
+ const _hoisted_1$3 = { class: "ui-v1-radio-switch-option__head" };
627
+ const _hoisted_2$1 = {
628
+ key: 0,
629
+ class: "ui-v1-radio-switch-option__icon"
630
+ };
631
+ const _hoisted_3$1 = {
632
+ key: 1,
633
+ class: "ui-v1-radio-switch-option__label"
634
+ };
635
+ const _hoisted_4 = {
636
+ key: 0,
637
+ class: "ui-v1-radio-switch-option__description"
638
+ };
639
+ const _hoisted_5 = {
640
+ key: 1,
641
+ class: "ui-v1-radio-switch-option__done"
642
+ };
643
+ let counter$1 = 0;
644
+ const __default__ = {};
645
+ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
646
+ ...__default__,
647
+ ...{
648
+ inheritAttrs: false
649
+ },
650
+ __name: "UiRadioSwitchOption",
651
+ props: {
652
+ /** Идентификатор */
653
+ id: {
654
+ type: String,
655
+ default: () => "ui-v1-radio-switch-option-" + ++counter$1
656
+ },
657
+ /** Заголовок */
658
+ label: {
659
+ type: String,
660
+ default: ""
661
+ },
662
+ /** Значение опции */
663
+ value: {
664
+ type: null,
665
+ required: true
666
+ },
667
+ /** Используется только c appearance=section */
668
+ description: {
669
+ type: String,
670
+ default: ""
671
+ },
672
+ /** Индикатор, заблокирована опция или нет */
673
+ disabled: {
674
+ type: Boolean,
675
+ default: false
676
+ }
677
+ },
678
+ setup(__props) {
679
+ const props = __props;
680
+ const slots = vue.useSlots();
681
+ const appearance = useAppearance();
682
+ const focusableId = useFocusableId();
683
+ const moveFocus = useMoveFocus();
684
+ const shell = vue.useTemplateRef("shell");
685
+ const size = useSize();
686
+ const registry = useRegistry();
687
+ const setFocusableId = useSetFocusableId();
688
+ const update = useUpdate();
689
+ const checked = vue.ref(false);
690
+ const tabIndex = vue.computed(() => {
691
+ return !props.disabled && focusableId.value === props.id ? 0 : -1;
692
+ });
693
+ const onClick = () => {
694
+ if (!props.disabled) {
695
+ setFocusableId(props.id);
696
+ update(props.value);
697
+ }
698
+ };
699
+ const onFocus = () => {
700
+ if (!props.disabled) {
701
+ setFocusableId(props.id);
702
+ }
703
+ };
704
+ const onKeyDown = (event) => {
705
+ if (props.disabled) {
706
+ return;
707
+ }
708
+ switch (event.key) {
709
+ case " ":
710
+ case "Enter":
711
+ setFocusableId(props.id);
712
+ update(props.value);
713
+ return;
714
+ case "ArrowDown":
715
+ case "ArrowRight":
716
+ void moveFocus(props.id, "next");
717
+ return;
718
+ case "ArrowUp":
719
+ case "ArrowLeft":
720
+ void moveFocus(props.id, "prev");
721
+ return;
722
+ case "Home":
723
+ void moveFocus(props.id, "first");
724
+ return;
725
+ case "End":
726
+ void moveFocus(props.id, "last");
727
+ return;
728
+ }
729
+ };
730
+ vue.onBeforeMount(() => {
731
+ registry.register(props.id, {
732
+ getValue: () => props.value,
733
+ checked,
734
+ disabled: () => props.disabled,
735
+ focus: () => shell.value?.focus()
736
+ });
737
+ });
738
+ vue.onBeforeUnmount(() => {
739
+ registry.unregister(props.id);
740
+ });
741
+ return (_ctx, _cache) => {
742
+ return vue.openBlock(), vue.createBlock(vue.unref(UiRadioSwitchOptionShell), vue.mergeProps({
743
+ id: __props.id,
744
+ ref_key: "shell",
745
+ ref: shell,
746
+ appearance: vue.unref(appearance),
747
+ size: vue.unref(size),
748
+ checked: checked.value,
749
+ disabled: __props.disabled,
750
+ tabindex: tabIndex.value
751
+ }, _ctx.$attrs, {
752
+ onClick,
753
+ onFocus,
754
+ onKeydown: [
755
+ remote.withKeys(remote.withModifiers(onKeyDown, ["prevent"]), ["space"]),
756
+ remote.withKeys(remote.withModifiers(onKeyDown, ["prevent"]), ["enter"]),
757
+ remote.withKeys(remote.withModifiers(onKeyDown, ["prevent"]), ["left"]),
758
+ remote.withKeys(remote.withModifiers(onKeyDown, ["prevent"]), ["right"]),
759
+ remote.withKeys(remote.withModifiers(onKeyDown, ["prevent"]), ["up"]),
760
+ remote.withKeys(remote.withModifiers(onKeyDown, ["prevent"]), ["down"]),
761
+ remote.withKeys(remote.withModifiers(onKeyDown, ["prevent"]), ["home"]),
762
+ remote.withKeys(remote.withModifiers(onKeyDown, ["prevent"]), ["end"])
763
+ ]
764
+ }), {
765
+ default: vue.withCtx(() => [
766
+ vue.renderSlot(_ctx.$slots, "default", {}, () => [
767
+ vue.createElementVNode("div", _hoisted_1$3, [
768
+ "icon" in vue.unref(slots) ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_2$1, [
769
+ vue.renderSlot(_ctx.$slots, "icon")
770
+ ])) : vue.createCommentVNode("", true),
771
+ "label" in vue.unref(slots) || __props.label ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$1, [
772
+ vue.renderSlot(_ctx.$slots, "label", {}, () => [
773
+ vue.createTextVNode(vue.toDisplayString(__props.label), 1)
774
+ ])
775
+ ])) : vue.createCommentVNode("", true)
776
+ ]),
777
+ vue.unref(appearance) === vue.unref(APPEARANCE).SECTION ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 0 }, [
778
+ "description" in vue.unref(slots) || __props.description ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4, [
779
+ vue.renderSlot(_ctx.$slots, "description", {}, () => [
780
+ vue.createTextVNode(vue.toDisplayString(__props.description), 1)
781
+ ])
782
+ ])) : vue.createCommentVNode("", true),
783
+ checked.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_5, [
784
+ vue.renderSlot(_ctx.$slots, "checkmark", {}, () => [
785
+ vue.createVNode(vue.unref(IconCheckmarkCircle))
786
+ ])
787
+ ])) : vue.createCommentVNode("", true)
788
+ ], 64)) : vue.createCommentVNode("", true)
789
+ ])
790
+ ]),
791
+ _: 3
792
+ }, 16, ["id", "appearance", "size", "checked", "disabled", "tabindex", "onKeydown"]);
793
+ };
794
+ }
795
+ });
796
+ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
797
+ ...{
798
+ inheritAttrs: false
799
+ },
800
+ __name: "UiRadioSwitch",
801
+ props: {
802
+ /** Выбранное значение */
803
+ value: {
804
+ type: null,
805
+ default: null
806
+ },
807
+ /** Список опций */
808
+ options: {
809
+ type: Array,
810
+ default: () => []
811
+ },
812
+ /** Предикат равенства */
813
+ equalFn: {
814
+ type: Function,
815
+ default: (a, b) => a === b
816
+ },
817
+ /** Внешний вид */
818
+ appearance: {
819
+ type: String,
820
+ default: APPEARANCE.DEFAULT,
821
+ validator: (appearance) => Object.values(APPEARANCE).includes(appearance)
822
+ },
823
+ /** Размер */
824
+ size: {
825
+ type: String,
826
+ default: SIZE$2.MD,
827
+ validator: (size) => Object.values(SIZE$2).includes(size)
828
+ },
829
+ /** Растягивание контейнера в зависимости от контента */
830
+ rubber: {
831
+ type: Boolean,
832
+ default: false
833
+ }
834
+ },
835
+ emits: ["change", "update:value"],
836
+ setup(__props, { emit: __emit }) {
837
+ const props = __props;
838
+ const emit = __emit;
839
+ const registry = /* @__PURE__ */ new Map();
840
+ const focusableId = vue.ref(null);
841
+ const getEnabledEntries = () => {
842
+ return Array.from(registry.entries()).filter(([, option]) => !option.disabled());
843
+ };
844
+ const syncFocusableId = (preferredId) => {
845
+ const enabledEntries = getEnabledEntries();
846
+ const enabledIds = new Set(enabledEntries.map(([id]) => id));
847
+ const selectedEntry = enabledEntries.find(([, option]) => option.checked.value);
848
+ if (preferredId && enabledIds.has(preferredId)) {
849
+ focusableId.value = preferredId;
850
+ return;
851
+ }
852
+ if (focusableId.value && enabledIds.has(focusableId.value)) {
853
+ return;
854
+ }
855
+ focusableId.value = selectedEntry?.[0] ?? enabledEntries[0]?.[0] ?? null;
856
+ };
857
+ vue.provide(AppearanceKey, vue.computed(() => props.appearance));
858
+ vue.provide(FocusableIdKey, vue.computed(() => focusableId.value));
859
+ vue.provide(SizeKey, vue.computed(() => props.size));
860
+ vue.provide(SetFocusableIdKey, (id) => {
861
+ syncFocusableId(id);
862
+ });
863
+ vue.provide(RegistryKey, {
864
+ register: (id, option) => {
865
+ if (registry.has(id)) {
866
+ return;
867
+ }
868
+ option.checked.value = props.equalFn(option.getValue(), props.value);
869
+ registry.set(id, option);
870
+ syncFocusableId(option.checked.value ? id : focusableId.value);
871
+ },
872
+ unregister: (id) => {
873
+ registry.delete(id);
874
+ if (focusableId.value === id) {
875
+ syncFocusableId();
876
+ }
877
+ }
878
+ });
879
+ vue.provide(UpdateKey, (newValue) => {
880
+ emit("change", newValue);
881
+ emit("update:value", newValue);
882
+ });
883
+ vue.provide(MoveFocusKey, async (id, direction) => {
884
+ const enabledEntries = getEnabledEntries();
885
+ if (!enabledEntries.length) {
886
+ focusableId.value = null;
887
+ return;
888
+ }
889
+ let targetEntry = enabledEntries[0];
890
+ if (direction === "first") {
891
+ targetEntry = enabledEntries[0];
892
+ } else if (direction === "last") {
893
+ targetEntry = enabledEntries.at(-1) ?? enabledEntries[0];
894
+ } else {
895
+ const currentIndex = enabledEntries.findIndex(([entryId]) => entryId === id);
896
+ const fallbackIndex = focusableId.value ? enabledEntries.findIndex(([entryId]) => entryId === focusableId.value) : -1;
897
+ const baseIndex = currentIndex === -1 ? Math.max(fallbackIndex, 0) : currentIndex;
898
+ const offset = direction === "next" ? 1 : -1;
899
+ const nextIndex = (baseIndex + offset + enabledEntries.length) % enabledEntries.length;
900
+ targetEntry = enabledEntries[nextIndex] ?? enabledEntries[0];
901
+ }
902
+ if (!targetEntry) {
903
+ return;
904
+ }
905
+ const [targetId, target] = targetEntry;
906
+ focusableId.value = targetId;
907
+ emit("change", target.getValue());
908
+ emit("update:value", target.getValue());
909
+ await target.focus();
910
+ });
911
+ vue.watch([() => props.value, () => props.equalFn], ([newValue]) => {
912
+ let selectedId = null;
913
+ Array.from(registry.values()).forEach((option) => {
914
+ option.checked.value = props.equalFn(option.getValue(), newValue);
915
+ });
916
+ selectedId = Array.from(registry.entries()).find(([, option]) => {
917
+ return option.checked.value && !option.disabled();
918
+ })?.[0] ?? null;
919
+ syncFocusableId(selectedId);
920
+ });
921
+ return (_ctx, _cache) => {
922
+ return vue.openBlock(), vue.createBlock(vue.unref(UiRadioSwitchRoot), vue.mergeProps({
923
+ appearance: __props.appearance,
924
+ size: __props.size,
925
+ rubber: __props.rubber
926
+ }, _ctx.$attrs), {
927
+ default: vue.withCtx(() => [
928
+ vue.renderSlot(_ctx.$slots, "default", {}, () => [
929
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.options, (option, index) => {
930
+ return vue.openBlock(), vue.createBlock(_sfc_main$7, {
931
+ key: `${option.label}-${index}`,
932
+ label: option.label,
933
+ value: option.value,
934
+ disabled: option.disabled
935
+ }, vue.createSlots({ _: 2 }, [
936
+ _ctx.$slots.icon ? {
937
+ name: "icon",
938
+ fn: vue.withCtx(() => [
939
+ vue.renderSlot(_ctx.$slots, "icon", { option })
940
+ ]),
941
+ key: "0"
942
+ } : void 0
943
+ ]), 1032, ["label", "value", "disabled"]);
944
+ }), 128))
945
+ ])
946
+ ]),
947
+ _: 3
948
+ }, 16, ["appearance", "size", "rubber"]);
949
+ };
950
+ }
951
+ });
397
952
  const UiScrollBoxType = "UiScrollBox";
398
953
  const UiScrollBox = remote.defineRemoteComponent(
399
954
  UiScrollBoxType,
@@ -415,6 +970,30 @@ const UiSwitch = remote.defineRemoteComponent(
415
970
  UiSwitchType,
416
971
  ["click", "focus", "blur"]
417
972
  );
973
+ const UiTabGroupType = "UiTabGroup";
974
+ const UiTabType = "UiTab";
975
+ const UiTab = remote.defineRemoteComponent(
976
+ UiTabType,
977
+ [],
978
+ [
979
+ "default",
980
+ "icon",
981
+ "label",
982
+ "counter",
983
+ "content"
984
+ ]
985
+ );
986
+ const UiTabGroup = remote.defineRemoteComponent(
987
+ UiTabGroupType,
988
+ [
989
+ "layout",
990
+ "change",
991
+ "update:activeId",
992
+ "update:focusableId",
993
+ "update:menuExpanded"
994
+ ],
995
+ ["default"]
996
+ );
418
997
  var ALIGN = /* @__PURE__ */ ((ALIGN2) => {
419
998
  ALIGN2["LEFT"] = "left";
420
999
  ALIGN2["CENTER"] = "center";
@@ -1323,7 +1902,7 @@ const UiSelectOptionType = "UiSelectOption";
1323
1902
  remote.defineRemoteComponent(
1324
1903
  UiSelectOptionType
1325
1904
  );
1326
- const _hoisted_1$3 = {
1905
+ const _hoisted_1$2 = {
1327
1906
  key: 0,
1328
1907
  class: "ui-v1-select__no-results-text"
1329
1908
  };
@@ -1716,7 +2295,7 @@ const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
1716
2295
  onHide: close
1717
2296
  }, {
1718
2297
  default: vue.withCtx(() => [
1719
- __props.filterable && optionsRegistry.value.every((o) => !o.isMatched()) && noResult.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$3, vue.toDisplayString(noResult.value), 1)) : vue.createCommentVNode("", true),
2298
+ __props.filterable && optionsRegistry.value.every((o) => !o.isMatched()) && noResult.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$2, vue.toDisplayString(noResult.value), 1)) : vue.createCommentVNode("", true),
1720
2299
  vue.renderSlot(_ctx.$slots, "default")
1721
2300
  ]),
1722
2301
  _: 3
@@ -1727,21 +2306,6 @@ const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
1727
2306
  };
1728
2307
  }
1729
2308
  });
1730
- const _hoisted_1$2 = {
1731
- xmlns: "http://www.w3.org/2000/svg",
1732
- viewBox: "0 0 24 24"
1733
- };
1734
- function render$1(_ctx, _cache) {
1735
- return vue.openBlock(), vue.createElementBlock("svg", _hoisted_1$2, [..._cache[0] || (_cache[0] = [
1736
- vue.createElementVNode("path", {
1737
- fill: "currentColor",
1738
- "fill-rule": "evenodd",
1739
- d: "M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10A10 10 0 0 0 12 2m0 18a8 8 0 1 1 0-16 8 8 0 0 1 0 16m1-9h2.5a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5H13v2.5a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5V13H8.5a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5H11V8.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5z",
1740
- "clip-rule": "evenodd"
1741
- }, null, -1)
1742
- ])]);
1743
- }
1744
- const IconAddCircleOutlined = { render: render$1 };
1745
2309
  const _hoisted_1$1 = {
1746
2310
  xmlns: "http://www.w3.org/2000/svg",
1747
2311
  viewBox: "0 0 24 24"
@@ -1751,12 +2315,12 @@ function render(_ctx, _cache) {
1751
2315
  vue.createElementVNode("path", {
1752
2316
  fill: "currentColor",
1753
2317
  "fill-rule": "evenodd",
1754
- d: "M2 12C2 6.477 6.477 2 12 2A10 10 0 1 1 2 12m8.73 3.35 5.62-5.62a.5.5 0 0 0 0-.69l-.53-.53a.5.5 0 0 0-.7 0l-4.74 4.74-1.5-1.49a.48.48 0 0 0-.7 0l-.53.53a.5.5 0 0 0 0 .71l2.38 2.35a.48.48 0 0 0 .7 0",
2318
+ d: "M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10A10 10 0 0 0 12 2m0 18a8 8 0 1 1 0-16 8 8 0 0 1 0 16m1-9h2.5a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5H13v2.5a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5V13H8.5a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5H11V8.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5z",
1755
2319
  "clip-rule": "evenodd"
1756
2320
  }, null, -1)
1757
2321
  ])]);
1758
2322
  }
1759
- const IconCheckmarkCircle = { render };
2323
+ const IconAddCircleOutlined = { render };
1760
2324
  var SIZE = /* @__PURE__ */ ((SIZE2) => {
1761
2325
  SIZE2["XS"] = "xs";
1762
2326
  SIZE2["SM"] = "sm";
@@ -2100,13 +2664,19 @@ const createEndpointRoot = async (channel) => {
2100
2664
  "UiModalWindow",
2101
2665
  "UiModalWindowSurface",
2102
2666
  "UiNumberStepper",
2667
+ "UiPageHeader",
2668
+ "UiPageHeaderTitle",
2103
2669
  "UiPopper",
2104
2670
  "UiPopperConnector",
2105
2671
  "UiPopperTarget",
2106
2672
  "UiRadio",
2673
+ "UiRadioSwitchOptionShell",
2674
+ "UiRadioSwitchRoot",
2107
2675
  "UiScrollBox",
2108
2676
  "UiSlider",
2109
2677
  "UiSwitch",
2678
+ "UiTab",
2679
+ "UiTabGroup",
2110
2680
  "UiSelectPopper",
2111
2681
  "UiSelectTrigger",
2112
2682
  "UiTableBodyCell",
@@ -2211,7 +2781,7 @@ exports.UiDatePickerType = UiDatePickerType;
2211
2781
  exports.UiDateType = UiDateType;
2212
2782
  exports.UiError = UiError;
2213
2783
  exports.UiErrorType = UiErrorType;
2214
- exports.UiField = _sfc_main$6;
2784
+ exports.UiField = _sfc_main$9;
2215
2785
  exports.UiInfobox = UiInfobox;
2216
2786
  exports.UiInfoboxType = UiInfoboxType;
2217
2787
  exports.UiLink = UiLink;
@@ -2230,6 +2800,7 @@ exports.UiModalWindowSurfaceType = UiModalWindowSurfaceType;
2230
2800
  exports.UiModalWindowType = UiModalWindowType;
2231
2801
  exports.UiNumberStepper = UiNumberStepper;
2232
2802
  exports.UiNumberStepperType = UiNumberStepperType;
2803
+ exports.UiPageHeader = _sfc_main$8;
2233
2804
  exports.UiPopper = UiPopper;
2234
2805
  exports.UiPopperConnector = UiPopperConnector;
2235
2806
  exports.UiPopperConnectorType = UiPopperConnectorType;
@@ -2237,6 +2808,8 @@ exports.UiPopperTarget = UiPopperTarget;
2237
2808
  exports.UiPopperTargetType = UiPopperTargetType;
2238
2809
  exports.UiPopperType = UiPopperType;
2239
2810
  exports.UiRadio = UiRadio;
2811
+ exports.UiRadioSwitch = _sfc_main$6;
2812
+ exports.UiRadioSwitchOption = _sfc_main$7;
2240
2813
  exports.UiRadioType = UiRadioType;
2241
2814
  exports.UiScrollBox = UiScrollBox;
2242
2815
  exports.UiScrollBoxType = UiScrollBoxType;
@@ -2247,6 +2820,10 @@ exports.UiSlider = UiSlider;
2247
2820
  exports.UiSliderType = UiSliderType;
2248
2821
  exports.UiSwitch = UiSwitch;
2249
2822
  exports.UiSwitchType = UiSwitchType;
2823
+ exports.UiTab = UiTab;
2824
+ exports.UiTabGroup = UiTabGroup;
2825
+ exports.UiTabGroupType = UiTabGroupType;
2826
+ exports.UiTabType = UiTabType;
2250
2827
  exports.UiTable = _sfc_main$4;
2251
2828
  exports.UiTableBodyCell = UiTableBodyCell;
2252
2829
  exports.UiTableColumn = _sfc_main$5;