@ryuzaki13/react-foundation-ui 3.4.3 → 3.5.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.
- package/dist/badge/index.js +65 -2
- package/dist/badge/index.js.map +1 -0
- package/dist/barcode-scanner/index.js +18 -18
- package/dist/base-table/index.js +2 -2
- package/dist/button/index.js +1 -1
- package/dist/check-box/index.js +1 -1
- package/dist/chunks/{CalendarView-Dm55k0bN.js → CalendarView-CwbPJG2Y.js} +86 -86
- package/dist/chunks/{CalendarView-Dm55k0bN.js.map → CalendarView-CwbPJG2Y.js.map} +1 -1
- package/dist/chunks/{ImageViewerRuntime-HGBWp9NM.js → ImageViewerRuntime-DZpgxzF1.js} +25 -25
- package/dist/chunks/{ImageViewerRuntime-HGBWp9NM.js.map → ImageViewerRuntime-DZpgxzF1.js.map} +1 -1
- package/dist/chunks/{TextEditorLexicalClient-C8nSoz85.js → TextEditorLexicalClient-BRp8jHId.js} +354 -354
- package/dist/chunks/{TextEditorLexicalClient-C8nSoz85.js.map → TextEditorLexicalClient-BRp8jHId.js.map} +1 -1
- package/dist/chunks/{base-table-BWvKfI2W.js → base-table-BHmboNzl.js} +138 -138
- package/dist/chunks/{base-table-BWvKfI2W.js.map → base-table-BHmboNzl.js.map} +1 -1
- package/dist/chunks/{button-DF21yxVp.js → button-D7GAU2Wa.js} +20 -20
- package/dist/chunks/{button-DF21yxVp.js.map → button-D7GAU2Wa.js.map} +1 -1
- package/dist/chunks/{check-box-CZyhzmR0.js → check-box-D_Y6iIWv.js} +19 -19
- package/dist/chunks/{check-box-CZyhzmR0.js.map → check-box-D_Y6iIWv.js.map} +1 -1
- package/dist/chunks/{context-menu-DgvXGCuI.js → context-menu-BQePxRpu.js} +159 -159
- package/dist/chunks/{context-menu-DgvXGCuI.js.map → context-menu-BQePxRpu.js.map} +1 -1
- package/dist/chunks/{date-input-D7aBsPJc.js → date-input-Crijdmmq.js} +67 -67
- package/dist/chunks/{date-input-D7aBsPJc.js.map → date-input-Crijdmmq.js.map} +1 -1
- package/dist/chunks/{date-range-preset-select-BLnY47cv.js → date-range-preset-select-CyzGMvVp.js} +6 -6
- package/dist/chunks/{date-range-preset-select-BLnY47cv.js.map → date-range-preset-select-CyzGMvVp.js.map} +1 -1
- package/dist/chunks/{dialog-1Z1zCNCe.js → dialog-BcQGVNbu.js} +13 -13
- package/dist/chunks/{dialog-1Z1zCNCe.js.map → dialog-BcQGVNbu.js.map} +1 -1
- package/dist/chunks/{flex-C7njxZ74.js → flex-DtXK7OM4.js} +29 -29
- package/dist/chunks/{flex-C7njxZ74.js.map → flex-DtXK7OM4.js.map} +1 -1
- package/dist/chunks/{floating-arrow-DPKwJfww.js → floating-arrow-DKUKx2ZQ.js} +7 -7
- package/dist/chunks/{floating-arrow-DPKwJfww.js.map → floating-arrow-DKUKx2ZQ.js.map} +1 -1
- package/dist/chunks/{input-DSPKgiCK.js → input-CuRK9Vbz.js} +78 -78
- package/dist/chunks/{input-DSPKgiCK.js.map → input-CuRK9Vbz.js.map} +1 -1
- package/dist/chunks/{input-files-tIS17-zX.js → input-files-B8j6Pb_M.js} +31 -31
- package/dist/chunks/{input-files-tIS17-zX.js.map → input-files-B8j6Pb_M.js.map} +1 -1
- package/dist/chunks/{misc-DeGboAt-.js → misc-CGQOXXCy.js} +110 -110
- package/dist/chunks/{misc-DeGboAt-.js.map → misc-CGQOXXCy.js.map} +1 -1
- package/dist/chunks/{modal-dplfAaER.js → modal-febBsMyR.js} +58 -58
- package/dist/chunks/{modal-dplfAaER.js.map → modal-febBsMyR.js.map} +1 -1
- package/dist/chunks/{picker-lvm82d0A.js → picker-BA6okKnz.js} +91 -91
- package/dist/chunks/{picker-lvm82d0A.js.map → picker-BA6okKnz.js.map} +1 -1
- package/dist/chunks/popover-yl5DVe06.js +245 -0
- package/dist/chunks/{popover-Bne-Ljbs.js.map → popover-yl5DVe06.js.map} +1 -1
- package/dist/chunks/radio-group-CW-K1n9c.js +125 -0
- package/dist/chunks/{radio-group-sSnlYjAX.js.map → radio-group-CW-K1n9c.js.map} +1 -1
- package/dist/chunks/select-DblNSc5H.js +363 -0
- package/dist/chunks/{select-aTGupQan.js.map → select-DblNSc5H.js.map} +1 -1
- package/dist/chunks/{separator-B72Aq-6a.js → separator-CIqnk2z9.js} +2 -2
- package/dist/chunks/{separator-B72Aq-6a.js.map → separator-CIqnk2z9.js.map} +1 -1
- package/dist/chunks/{sortable-BKIwlqhI.js → sortable-CQmMHAF8.js} +38 -38
- package/dist/chunks/{sortable-BKIwlqhI.js.map → sortable-CQmMHAF8.js.map} +1 -1
- package/dist/chunks/{table-DxoSOvQK.js → table-BnvjPaE1.js} +18 -18
- package/dist/chunks/{table-DxoSOvQK.js.map → table-BnvjPaE1.js.map} +1 -1
- package/dist/chunks/{table-column-interactions-DzEvVuXe.js → table-column-interactions-Do8LFtiv.js} +20 -20
- package/dist/chunks/{table-column-interactions-DzEvVuXe.js.map → table-column-interactions-Do8LFtiv.js.map} +1 -1
- package/dist/chunks/{types-D9Wj9wrg.js → types-CxXyru6U.js} +21 -21
- package/dist/chunks/{types-D9Wj9wrg.js.map → types-CxXyru6U.js.map} +1 -1
- package/dist/chunks/{useODataSelectBase-DR4PrY1j.js → useODataSelectBase-DwR4Lfv-.js} +5 -5
- package/dist/chunks/{useODataSelectBase-DR4PrY1j.js.map → useODataSelectBase-DwR4Lfv-.js.map} +1 -1
- package/dist/chunks/{wheel-picker-FS58cRsQ.js → wheel-picker-DUHGy7wE.js} +23 -23
- package/dist/chunks/{wheel-picker-FS58cRsQ.js.map → wheel-picker-DUHGy7wE.js.map} +1 -1
- package/dist/context-menu/index.js +1 -1
- package/dist/date-input/index.js +2 -2
- package/dist/date-range-preset-select/index.js +1 -1
- package/dist/date-time-input/index.js +122 -122
- package/dist/date-time-input/index.js.map +1 -1
- package/dist/detail/index.js +22 -22
- package/dist/dialog/index.js +1 -1
- package/dist/disclosure/index.js +9 -9
- package/dist/drop-zone/index.js +21 -21
- package/dist/errors/index.js +50 -50
- package/dist/expandable-action-panel/index.js +24 -24
- package/dist/flex/index.js +1 -1
- package/dist/flex/useFlexClasses.d.ts +1 -1
- package/dist/floating-arrow/index.js +1 -1
- package/dist/fullscreen-portal/index.js +8 -8
- package/dist/image/index.js +119 -119
- package/dist/input/index.js +1 -1
- package/dist/input-date-time/index.js +55 -55
- package/dist/input-file/index.js +16 -16
- package/dist/input-files/index.js +1 -1
- package/dist/input-image/index.js +17 -17
- package/dist/input-search/index.js +30 -2
- package/dist/input-search/index.js.map +1 -0
- package/dist/layout-picker/index.js +93 -93
- package/dist/layout-picker/index.js.map +1 -1
- package/dist/list/index.js +39 -39
- package/dist/listbox/index.js +33 -33
- package/dist/misc/index.js +1 -1
- package/dist/modal/index.js +1 -1
- package/dist/multi-select/index.js +466 -2
- package/dist/multi-select/index.js.map +1 -0
- package/dist/notifications/index.js +45 -45
- package/dist/option/index.js +30 -30
- package/dist/period-select/index.js +7 -7
- package/dist/picker/index.js +1 -1
- package/dist/popover/index.js +1 -1
- package/dist/preset-range-date-input/index.js +10 -10
- package/dist/preset-select/index.js +1 -1
- package/dist/radio-button/index.js +9 -9
- package/dist/radio-group/index.js +1 -1
- package/dist/select/index.js +1 -1
- package/dist/separator/index.js +1 -1
- package/dist/simple-table/index.js +5 -5
- package/dist/slider/index.js +82 -82
- package/dist/slider/index.js.map +1 -1
- package/dist/sortable/index.js +1 -1
- package/dist/splitter/index.js +55 -55
- package/dist/state-select/index.js +17 -17
- package/dist/styles.css +1 -1
- package/dist/switch/index.js +18 -18
- package/dist/table/index.js +1 -1
- package/dist/table-column-interactions/index.js +1 -1
- package/dist/table-editor/index.js +99 -99
- package/dist/table-sorting/index.js +13 -13
- package/dist/tabs/index.js +83 -83
- package/dist/tag-input/index.js +58 -58
- package/dist/tag-input/index.js.map +1 -1
- package/dist/text/index.js +18 -18
- package/dist/text-editor/index.js +3 -3
- package/dist/textarea/index.js +1 -1
- package/dist/three-scene/index.js +7 -7
- package/dist/toggle/index.js +20 -20
- package/dist/toolbar/index.js +16 -16
- package/dist/tree/index.js +24 -24
- package/dist/tree-select/index.js +189 -189
- package/dist/tree-select/index.js.map +1 -1
- package/dist/tree-table/index.js +33 -33
- package/dist/tree-table/index.js.map +1 -1
- package/dist/wheel-picker/index.js +1 -1
- package/package.json +1 -5
- package/storybook-static/project.json +1 -1
- package/dist/advanced-search/index.d.ts +0 -3
- package/dist/advanced-search/index.d.ts.map +0 -1
- package/dist/advanced-search/index.js +0 -399
- package/dist/advanced-search/index.js.map +0 -1
- package/dist/advanced-search/lib/index.d.ts +0 -2
- package/dist/advanced-search/lib/index.d.ts.map +0 -1
- package/dist/advanced-search/lib/searchParts.d.ts +0 -3
- package/dist/advanced-search/lib/searchParts.d.ts.map +0 -1
- package/dist/advanced-search/model/index.d.ts +0 -5
- package/dist/advanced-search/model/index.d.ts.map +0 -1
- package/dist/advanced-search/model/types.d.ts +0 -55
- package/dist/advanced-search/model/types.d.ts.map +0 -1
- package/dist/advanced-search/model/useAdvancedSearch.d.ts +0 -11
- package/dist/advanced-search/model/useAdvancedSearch.d.ts.map +0 -1
- package/dist/advanced-search/model/useAdvancedSearchInitialSelected.d.ts +0 -6
- package/dist/advanced-search/model/useAdvancedSearchInitialSelected.d.ts.map +0 -1
- package/dist/advanced-search/model/useAdvancedSearchSelection.d.ts +0 -13
- package/dist/advanced-search/model/useAdvancedSearchSelection.d.ts.map +0 -1
- package/dist/advanced-search/ui/AdvancedSearchModal.d.ts +0 -23
- package/dist/advanced-search/ui/AdvancedSearchModal.d.ts.map +0 -1
- package/dist/advanced-search/ui/AdvancedSearchModalSession.d.ts +0 -16
- package/dist/advanced-search/ui/AdvancedSearchModalSession.d.ts.map +0 -1
- package/dist/advanced-search/ui/AdvancedSearchSelect.d.ts +0 -9
- package/dist/advanced-search/ui/AdvancedSearchSelect.d.ts.map +0 -1
- package/dist/advanced-search/ui/AdvancedSearchSelectUI.d.ts +0 -9
- package/dist/advanced-search/ui/AdvancedSearchSelectUI.d.ts.map +0 -1
- package/dist/advanced-search/ui/index.d.ts +0 -2
- package/dist/advanced-search/ui/index.d.ts.map +0 -1
- package/dist/chunks/badge-6mXO9BWP.js +0 -65
- package/dist/chunks/badge-6mXO9BWP.js.map +0 -1
- package/dist/chunks/input-search-Cat4c7SM.js +0 -30
- package/dist/chunks/input-search-Cat4c7SM.js.map +0 -1
- package/dist/chunks/multi-select-BZ9N6Dal.js +0 -466
- package/dist/chunks/multi-select-BZ9N6Dal.js.map +0 -1
- package/dist/chunks/popover-Bne-Ljbs.js +0 -245
- package/dist/chunks/radio-group-sSnlYjAX.js +0 -125
- package/dist/chunks/select-aTGupQan.js +0 -363
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/tag-input/lib/joinTagInputAriaIds.ts","../../src/tag-input/lib/tagInputDefaults.ts","../../src/tag-input/TagInput.module.scss","../../src/tag-input/TagInput.tsx"],"sourcesContent":["/** Объединяет сгенерированные и пользовательские ARIA ID, исключая пустые части. */\nexport function joinTagInputAriaIds(...ids: Array<string | undefined>) {\n\treturn ids.filter(Boolean).join(\" \") || undefined;\n}\n","/** Удаляет внешние пробелы перед сохранением созданного тега. */\nexport function defaultNormalizeTag(value: string) {\n\treturn value.trim();\n}\n\n/** Сохраняет регистр и использует точное значение как ключ сравнения по умолчанию. */\nexport function defaultGetTagKey(value: string) {\n\treturn value;\n}\n\n/** Формирует доступное имя действия удаления с конкретным значением тега. */\nexport function defaultGetRemoveButtonAriaLabel(value: string) {\n\treturn `Удалить тег «${value}»`;\n}\n","@use \"@/styles/mixins\" as *;\n@use \"@/styles/tone-derived\" as toneDerived;\n\n.control {\n\tmin-height: var(--control-height);\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: wrap;\n\tgap: var(--space-xs);\n\tpadding: calc(var(--space-xs) / 2) var(--space-sm);\n\tcursor: text;\n\n\t--ui-color: var(--content-0);\n\t--ui-color-hover: var(--content-0);\n\t--ui-color-active: var(--content-0);\n\n\t&[data-readonly] {\n\t\tcursor: default;\n\t\tbackground-color: var(--surface-1);\n\t}\n}\n\n.tagList {\n\tmin-width: 0;\n\tmax-width: 100%;\n\tdisplay: flex;\n\talign-items: center;\n\tflex: 0 1 auto;\n\tflex-wrap: wrap;\n\tgap: var(--space-xs);\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.tag {\n\t@include ui-static-surface;\n\n\t--ui-color: var(--content-0);\n\t--ui-background: var(--surface-2);\n\t--ui-border-color: var(--border-0);\n\n\tmin-width: 0;\n\tmax-width: 100%;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: var(--space-xs);\n\tpadding: calc(var(--space-xs) / 2) var(--space-xs);\n\tfont-size: var(--font-size-sm);\n}\n\n.tagText {\n\tmin-width: 0;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.removeButton {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-shrink: 0;\n\twidth: 1.25em;\n\theight: 1.25em;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: var(--radius-xs);\n\tbackground: transparent;\n\tcolor: inherit;\n\ttransition:\n\t\tcolor var(--transition-fast) ease,\n\t\tbackground-color var(--transition-fast) ease;\n\n\t&:hover {\n\t\t@include toneDerived.tone-soft-declaration(\"background-color\", \"error\");\n\t\tcolor: var(--error-text);\n\t}\n\n\t&:focus-visible {\n\t\t@include focusVisible;\n\t}\n\n\tsvg {\n\t\tdisplay: block;\n\t}\n}\n\n.input {\n\tmin-width: 8ch;\n\tmin-height: calc(var(--control-height) - var(--space-xs) - (var(--border-width) * 2));\n\tflex: 1 1 8rem;\n\tpadding: 0;\n\tborder: none;\n\toutline: none;\n\tbackground: transparent;\n\tcolor: inherit;\n\tfont: inherit;\n\n\t&::placeholder {\n\t\tcolor: var(--content-2);\n\t}\n\n\t&:read-only {\n\t\tcursor: default;\n\t}\n}\n","import {\n\ttype ClipboardEvent,\n\ttype CompositionEvent,\n\ttype InputHTMLAttributes,\n\ttype KeyboardEvent,\n\ttype Ref,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState\n} from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { XIcon } from \"lucide-react\";\n\nimport { InputUI, useInputFieldIds } from \"../input\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport { joinTagInputAriaIds } from \"./lib/joinTagInputAriaIds\";\nimport { defaultGetRemoveButtonAriaLabel, defaultGetTagKey, defaultNormalizeTag } from \"./lib/tagInputDefaults\";\nimport styles from \"./TagInput.module.scss\";\n\nimport type { UiBaseProps } from \"../types\";\n\nconst TAG_DELIMITER_PATTERN = /[,\\r\\n]/;\nconst TAG_DELIMITER_SPLIT_PATTERN = /[,\\r\\n]+/;\n\nexport interface TagInputProps\n\textends\n\t\tOmit<InputHTMLAttributes<HTMLInputElement>, \"children\" | \"defaultValue\" | \"disabled\" | \"onChange\" | \"readOnly\" | \"size\" | \"value\">,\n\t\tUiBaseProps<string[], readonly string[]> {\n\t/** Ссылка на внутренний нативный `input`, передаваемая напрямую как React 19 prop. */\n\tref?: Ref<HTMLInputElement>;\n\n\t/** Сообщение валидации, связанное с полем через `aria-describedby`. */\n\terror?: string;\n\n\t/** Сбрасывает внешнюю ошибку после изменения черновика или набора тегов. */\n\tonClearError?: () => void;\n\n\t/** Запрещает изменение набора тегов, сохраняя возможность выделять и копировать текст. */\n\treadOnly?: boolean;\n\n\t/** Максимальное количество тегов. Отсутствие значения не ограничивает набор. */\n\tmaxTags?: number;\n\n\t/**\n\t * Нормализует введённое значение перед проверкой дубликата и добавлением.\n\t * По умолчанию удаляет пробелы в начале и конце.\n\t */\n\tnormalizeTag?: (value: string) => string;\n\n\t/**\n\t * Возвращает ключ сравнения тегов. Позволяет, например, запретить дубликаты без учёта регистра.\n\t * По умолчанию используется точное строковое сравнение.\n\t */\n\tgetTagKey?: (value: string) => string;\n\n\t/** Добавляет непустой черновик при уходе фокуса с input. По умолчанию включено. */\n\taddOnBlur?: boolean;\n\n\t/** Формирует доступное имя кнопки удаления конкретного тега. */\n\tgetRemoveButtonAriaLabel?: (value: string, index: number) => string;\n\n\t/** Доступное имя списка уже добавленных тегов. */\n\ttokensAriaLabel?: string;\n\n\t/** CSS-класс непосредственно для внутреннего `input`; `className` применяется к оболочке поля. */\n\tinputClassName?: string;\n}\n\n/**\n * Controlled-поле для создания коротких строковых тегов.\n *\n * Новое значение фиксируется по `Enter`, запятой, вставке списка или потере фокуса. Компонент хранит\n * только незавершённый текст input, а окончательный набор всегда принадлежит потребителю через `value`.\n */\nexport function TagInput({\n\tref,\n\tvalue,\n\tonChange,\n\tlabel,\n\tdescription,\n\tplaceholder,\n\tsize,\n\tdisabled,\n\treadOnly = false,\n\terror,\n\tonClearError,\n\tmaxTags,\n\tnormalizeTag = defaultNormalizeTag,\n\tgetTagKey = defaultGetTagKey,\n\taddOnBlur = true,\n\tgetRemoveButtonAriaLabel = defaultGetRemoveButtonAriaLabel,\n\ttokensAriaLabel = \"Добавленные теги\",\n\tinputClassName,\n\tclassName,\n\tid: externalId,\n\tname,\n\tform,\n\trequired,\n\tmaxLength,\n\tonKeyDown,\n\tonPaste,\n\tonBlur,\n\tonCompositionStart,\n\tonCompositionEnd,\n\t\"aria-describedby\": externalAriaDescribedBy,\n\t\"aria-labelledby\": externalAriaLabelledBy,\n\t...inputProps\n}: TagInputProps) {\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst controlRef = useRef<HTMLDivElement>(null);\n\tconst isComposingRef = useRef(false);\n\tconst [draft, setDraft] = useState(\"\");\n\tconst [announcement, setAnnouncement] = useState(\"\");\n\tconst { controlId, labelId, descriptionId, errorId, describedBy } = useInputFieldIds({\n\t\tid: externalId,\n\t\thasLabel: label !== undefined && label !== null,\n\t\thasDescription: !!description,\n\t\thasError: !!error\n\t});\n\tconst resolvedMaxTags = maxTags === undefined ? Number.POSITIVE_INFINITY : Math.max(0, Math.floor(maxTags));\n\tconst isEditingDisabled = disabled || readOnly;\n\tconst ariaDescribedBy = joinTagInputAriaIds(describedBy, externalAriaDescribedBy);\n\tconst ariaLabelledBy = joinTagInputAriaIds(labelId, externalAriaLabelledBy);\n\n\tuseImperativeHandle(ref, () => {\n\t\tconst input = inputRef.current;\n\n\t\tif (!input) {\n\t\t\tthrow new Error(\"TagInput: внутренний input недоступен при создании imperative handle.\");\n\t\t}\n\n\t\treturn input;\n\t}, []);\n\n\t/** Добавляет сразу несколько кандидатов одним controlled-обновлением и сообщает результат screen reader. */\n\tconst appendTags = (rawTags: readonly string[]) => {\n\t\tif (isEditingDisabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tonClearError?.();\n\n\t\tconst nextTags = [...value];\n\t\tconst knownKeys = new Set(nextTags.map((tag) => getTagKey(tag)));\n\t\tconst added: string[] = [];\n\t\tlet duplicateCount = 0;\n\t\tlet limitReached = false;\n\n\t\tfor (const rawTag of rawTags) {\n\t\t\tconst tag = normalizeTag(rawTag);\n\n\t\t\tif (!tag) continue;\n\n\t\t\tif (maxLength !== undefined && tag.length > maxLength) {\n\t\t\t\tsetAnnouncement(`Тег «${tag}» длиннее допустимого значения.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst key = getTagKey(tag);\n\n\t\t\tif (knownKeys.has(key)) {\n\t\t\t\tduplicateCount += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (nextTags.length >= resolvedMaxTags) {\n\t\t\t\tlimitReached = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tknownKeys.add(key);\n\t\t\tnextTags.push(tag);\n\t\t\tadded.push(tag);\n\t\t}\n\n\t\tif (added.length > 0) {\n\t\t\tonChange(nextTags);\n\t\t\tsetAnnouncement(added.length === 1 ? `Добавлен тег «${added[0]}».` : `Добавлено тегов: ${added.length}.`);\n\t\t} else if (limitReached) {\n\t\t\tsetAnnouncement(`Достигнуто максимальное количество тегов: ${resolvedMaxTags}.`);\n\t\t} else if (duplicateCount > 0) {\n\t\t\tsetAnnouncement(\"Такой тег уже добавлен.\");\n\t\t}\n\t};\n\n\tconst commitDraft = () => {\n\t\tif (!draft) return false;\n\n\t\tappendTags(draft.split(TAG_DELIMITER_SPLIT_PATTERN));\n\t\tsetDraft(\"\");\n\t\treturn true;\n\t};\n\n\tconst removeTag = (index: number) => {\n\t\tif (isEditingDisabled) return;\n\n\t\tconst removedTag = value[index];\n\t\tif (removedTag === undefined) return;\n\n\t\tonChange(value.filter((_, currentIndex) => currentIndex !== index));\n\t\tonClearError?.();\n\t\tsetAnnouncement(`Удалён тег «${removedTag}».`);\n\t\tinputRef.current?.focus();\n\t};\n\n\tconst handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n\t\tonKeyDown?.(event);\n\t\tif (event.defaultPrevented || event.nativeEvent.isComposing || isComposingRef.current || isEditingDisabled) return;\n\n\t\tif (event.key === \"Enter\" || event.key === \",\") {\n\t\t\tif (commitDraft() || event.key === \",\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"Backspace\" && draft.length === 0 && value.length > 0) {\n\t\t\tevent.preventDefault();\n\t\t\tremoveTag(value.length - 1);\n\t\t}\n\t};\n\n\tconst handlePaste = (event: ClipboardEvent<HTMLInputElement>) => {\n\t\tonPaste?.(event);\n\t\tif (event.defaultPrevented || isEditingDisabled) return;\n\n\t\tconst clipboardText = event.clipboardData.getData(\"text\");\n\t\tif (!TAG_DELIMITER_PATTERN.test(clipboardText)) return;\n\n\t\tevent.preventDefault();\n\t\tconst selectionStart = event.currentTarget.selectionStart ?? draft.length;\n\t\tconst selectionEnd = event.currentTarget.selectionEnd ?? selectionStart;\n\t\tconst pastedValue = `${draft.slice(0, selectionStart)}${clipboardText}${draft.slice(selectionEnd)}`;\n\n\t\tappendTags(pastedValue.split(TAG_DELIMITER_SPLIT_PATTERN));\n\t\tsetDraft(\"\");\n\t};\n\n\treturn (\n\t\t<InputUI\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tclassName={className}\n\t\t\tsize={size}\n\t\t\terror={error}\n\t\t\tcontrolId={controlId}\n\t\t\tlabelId={labelId}\n\t\t\tdescriptionId={descriptionId}\n\t\t\terrorId={errorId}>\n\t\t\t<div\n\t\t\t\tref={controlRef}\n\t\t\t\tclassName={cn(uiStyles.uiControl, error && uiStyles.invalid, styles.control)}\n\t\t\t\tdata-disabled={disabled ? \"\" : undefined}\n\t\t\t\tdata-readonly={readOnly ? \"\" : undefined}\n\t\t\t\tdata-invalid={error ? \"\" : undefined}\n\t\t\t\tonClick={() => inputRef.current?.focus()}>\n\t\t\t\t{value.length > 0 && (\n\t\t\t\t\t<ul className={styles.tagList} aria-label={tokensAriaLabel}>\n\t\t\t\t\t\t{value.map((tag, index) => (\n\t\t\t\t\t\t\t<li className={styles.tag} key={`${getTagKey(tag)}-${index}`}>\n\t\t\t\t\t\t\t\t<span className={styles.tagText}>{tag}</span>\n\t\t\t\t\t\t\t\t{!isEditingDisabled && (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclassName={styles.removeButton}\n\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\tremoveTag(index);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\taria-label={getRemoveButtonAriaLabel(tag, index)}>\n\t\t\t\t\t\t\t\t\t\t<XIcon aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ul>\n\t\t\t\t)}\n\n\t\t\t\t<input\n\t\t\t\t\t{...inputProps}\n\t\t\t\t\tref={inputRef}\n\t\t\t\t\tid={controlId}\n\t\t\t\t\tform={form}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\trequired={required && value.length === 0}\n\t\t\t\t\tmaxLength={maxLength}\n\t\t\t\t\tvalue={draft}\n\t\t\t\t\tplaceholder={value.length === 0 ? placeholder : undefined}\n\t\t\t\t\taria-invalid={!!error || undefined}\n\t\t\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\tclassName={cn(styles.input, inputClassName)}\n\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\tconst nextDraft = event.target.value;\n\t\t\t\t\t\tconst hasDelimiter = TAG_DELIMITER_PATTERN.test(nextDraft);\n\n\t\t\t\t\t\tif (isComposingRef.current) {\n\t\t\t\t\t\t\tsetDraft(nextDraft);\n\t\t\t\t\t\t} else if (hasDelimiter) {\n\t\t\t\t\t\t\tconst parts = nextDraft.split(TAG_DELIMITER_SPLIT_PATTERN);\n\t\t\t\t\t\t\tconst hasTrailingDelimiter = TAG_DELIMITER_PATTERN.test(nextDraft.at(-1) ?? \"\");\n\t\t\t\t\t\t\tconst uncommittedPart = hasTrailingDelimiter ? \"\" : (parts.pop() ?? \"\");\n\n\t\t\t\t\t\t\tappendTags(parts);\n\t\t\t\t\t\t\tsetDraft(uncommittedPart);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetDraft(nextDraft);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (isComposingRef.current || !hasDelimiter) {\n\t\t\t\t\t\t\tonClearError?.();\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\tonPaste={handlePaste}\n\t\t\t\t\tonCompositionStart={(event: CompositionEvent<HTMLInputElement>) => {\n\t\t\t\t\t\tisComposingRef.current = true;\n\t\t\t\t\t\tonCompositionStart?.(event);\n\t\t\t\t\t}}\n\t\t\t\t\tonCompositionEnd={(event: CompositionEvent<HTMLInputElement>) => {\n\t\t\t\t\t\tisComposingRef.current = false;\n\t\t\t\t\t\tonCompositionEnd?.(event);\n\t\t\t\t\t}}\n\t\t\t\t\tonBlur={(event) => {\n\t\t\t\t\t\tonBlur?.(event);\n\t\t\t\t\t\tconst nextFocusedNode = event.relatedTarget;\n\t\t\t\t\t\tconst focusRemainsInside = nextFocusedNode instanceof Node && controlRef.current?.contains(nextFocusedNode);\n\n\t\t\t\t\t\tif (!event.defaultPrevented && !focusRemainsInside && addOnBlur && !isEditingDisabled) {\n\t\t\t\t\t\t\tcommitDraft();\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t/>\n\n\t\t\t\t{name &&\n\t\t\t\t\tvalue.map((tag, index) => (\n\t\t\t\t\t\t<input key={`${getTagKey(tag)}-${index}`} type=\"hidden\" name={name} value={tag} form={form} disabled={disabled} />\n\t\t\t\t\t))}\n\t\t\t</div>\n\n\t\t\t<span className=\"visuallyHidden\" aria-live=\"polite\" aria-atomic=\"true\">\n\t\t\t\t{announcement}\n\t\t\t</span>\n\t\t</InputUI>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/tag-input/lib/joinTagInputAriaIds.ts","../../src/tag-input/lib/tagInputDefaults.ts","../../src/tag-input/TagInput.module.scss","../../src/tag-input/TagInput.tsx"],"sourcesContent":["/** Объединяет сгенерированные и пользовательские ARIA ID, исключая пустые части. */\nexport function joinTagInputAriaIds(...ids: Array<string | undefined>) {\n\treturn ids.filter(Boolean).join(\" \") || undefined;\n}\n","/** Удаляет внешние пробелы перед сохранением созданного тега. */\nexport function defaultNormalizeTag(value: string) {\n\treturn value.trim();\n}\n\n/** Сохраняет регистр и использует точное значение как ключ сравнения по умолчанию. */\nexport function defaultGetTagKey(value: string) {\n\treturn value;\n}\n\n/** Формирует доступное имя действия удаления с конкретным значением тега. */\nexport function defaultGetRemoveButtonAriaLabel(value: string) {\n\treturn `Удалить тег «${value}»`;\n}\n","@use \"@/styles/mixins\" as *;\n@use \"@/styles/tone-derived\" as toneDerived;\n\n.control {\n\tmin-height: var(--control-height);\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: wrap;\n\tgap: var(--space-xs);\n\tpadding: calc(var(--space-xs) / 2) var(--space-sm);\n\tcursor: text;\n\n\t--ui-color: var(--content-0);\n\t--ui-color-hover: var(--content-0);\n\t--ui-color-active: var(--content-0);\n\n\t&[data-readonly] {\n\t\tcursor: default;\n\t\tbackground-color: var(--surface-1);\n\t}\n}\n\n.tagList {\n\tmin-width: 0;\n\tmax-width: 100%;\n\tdisplay: flex;\n\talign-items: center;\n\tflex: 0 1 auto;\n\tflex-wrap: wrap;\n\tgap: var(--space-xs);\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.tag {\n\t@include ui-static-surface;\n\n\t--ui-color: var(--content-0);\n\t--ui-background: var(--surface-2);\n\t--ui-border-color: var(--border-0);\n\n\tmin-width: 0;\n\tmax-width: 100%;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: var(--space-xs);\n\tpadding: calc(var(--space-xs) / 2) var(--space-xs);\n\tfont-size: var(--font-size-sm);\n}\n\n.tagText {\n\tmin-width: 0;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.removeButton {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-shrink: 0;\n\twidth: 1.25em;\n\theight: 1.25em;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: var(--radius-xs);\n\tbackground: transparent;\n\tcolor: inherit;\n\ttransition:\n\t\tcolor var(--transition-fast) ease,\n\t\tbackground-color var(--transition-fast) ease;\n\n\t&:hover {\n\t\t@include toneDerived.tone-soft-declaration(\"background-color\", \"error\");\n\t\tcolor: var(--error-text);\n\t}\n\n\t&:focus-visible {\n\t\t@include focusVisible;\n\t}\n\n\tsvg {\n\t\tdisplay: block;\n\t}\n}\n\n.input {\n\tmin-width: 8ch;\n\tmin-height: calc(var(--control-height) - var(--space-xs) - (var(--border-width) * 2));\n\tflex: 1 1 8rem;\n\tpadding: 0;\n\tborder: none;\n\toutline: none;\n\tbackground: transparent;\n\tcolor: inherit;\n\tfont: inherit;\n\n\t&::placeholder {\n\t\tcolor: var(--content-2);\n\t}\n\n\t&:read-only {\n\t\tcursor: default;\n\t}\n}\n","import {\n\ttype ClipboardEvent,\n\ttype CompositionEvent,\n\ttype InputHTMLAttributes,\n\ttype KeyboardEvent,\n\ttype Ref,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState\n} from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { XIcon } from \"lucide-react\";\n\nimport { InputUI, useInputFieldIds } from \"../input\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport { joinTagInputAriaIds } from \"./lib/joinTagInputAriaIds\";\nimport { defaultGetRemoveButtonAriaLabel, defaultGetTagKey, defaultNormalizeTag } from \"./lib/tagInputDefaults\";\nimport styles from \"./TagInput.module.scss\";\n\nimport type { UiBaseProps } from \"../types\";\n\nconst TAG_DELIMITER_PATTERN = /[,\\r\\n]/;\nconst TAG_DELIMITER_SPLIT_PATTERN = /[,\\r\\n]+/;\n\nexport interface TagInputProps\n\textends\n\t\tOmit<InputHTMLAttributes<HTMLInputElement>, \"children\" | \"defaultValue\" | \"disabled\" | \"onChange\" | \"readOnly\" | \"size\" | \"value\">,\n\t\tUiBaseProps<string[], readonly string[]> {\n\t/** Ссылка на внутренний нативный `input`, передаваемая напрямую как React 19 prop. */\n\tref?: Ref<HTMLInputElement>;\n\n\t/** Сообщение валидации, связанное с полем через `aria-describedby`. */\n\terror?: string;\n\n\t/** Сбрасывает внешнюю ошибку после изменения черновика или набора тегов. */\n\tonClearError?: () => void;\n\n\t/** Запрещает изменение набора тегов, сохраняя возможность выделять и копировать текст. */\n\treadOnly?: boolean;\n\n\t/** Максимальное количество тегов. Отсутствие значения не ограничивает набор. */\n\tmaxTags?: number;\n\n\t/**\n\t * Нормализует введённое значение перед проверкой дубликата и добавлением.\n\t * По умолчанию удаляет пробелы в начале и конце.\n\t */\n\tnormalizeTag?: (value: string) => string;\n\n\t/**\n\t * Возвращает ключ сравнения тегов. Позволяет, например, запретить дубликаты без учёта регистра.\n\t * По умолчанию используется точное строковое сравнение.\n\t */\n\tgetTagKey?: (value: string) => string;\n\n\t/** Добавляет непустой черновик при уходе фокуса с input. По умолчанию включено. */\n\taddOnBlur?: boolean;\n\n\t/** Формирует доступное имя кнопки удаления конкретного тега. */\n\tgetRemoveButtonAriaLabel?: (value: string, index: number) => string;\n\n\t/** Доступное имя списка уже добавленных тегов. */\n\ttokensAriaLabel?: string;\n\n\t/** CSS-класс непосредственно для внутреннего `input`; `className` применяется к оболочке поля. */\n\tinputClassName?: string;\n}\n\n/**\n * Controlled-поле для создания коротких строковых тегов.\n *\n * Новое значение фиксируется по `Enter`, запятой, вставке списка или потере фокуса. Компонент хранит\n * только незавершённый текст input, а окончательный набор всегда принадлежит потребителю через `value`.\n */\nexport function TagInput({\n\tref,\n\tvalue,\n\tonChange,\n\tlabel,\n\tdescription,\n\tplaceholder,\n\tsize,\n\tdisabled,\n\treadOnly = false,\n\terror,\n\tonClearError,\n\tmaxTags,\n\tnormalizeTag = defaultNormalizeTag,\n\tgetTagKey = defaultGetTagKey,\n\taddOnBlur = true,\n\tgetRemoveButtonAriaLabel = defaultGetRemoveButtonAriaLabel,\n\ttokensAriaLabel = \"Добавленные теги\",\n\tinputClassName,\n\tclassName,\n\tid: externalId,\n\tname,\n\tform,\n\trequired,\n\tmaxLength,\n\tonKeyDown,\n\tonPaste,\n\tonBlur,\n\tonCompositionStart,\n\tonCompositionEnd,\n\t\"aria-describedby\": externalAriaDescribedBy,\n\t\"aria-labelledby\": externalAriaLabelledBy,\n\t...inputProps\n}: TagInputProps) {\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst controlRef = useRef<HTMLDivElement>(null);\n\tconst isComposingRef = useRef(false);\n\tconst [draft, setDraft] = useState(\"\");\n\tconst [announcement, setAnnouncement] = useState(\"\");\n\tconst { controlId, labelId, descriptionId, errorId, describedBy } = useInputFieldIds({\n\t\tid: externalId,\n\t\thasLabel: label !== undefined && label !== null,\n\t\thasDescription: !!description,\n\t\thasError: !!error\n\t});\n\tconst resolvedMaxTags = maxTags === undefined ? Number.POSITIVE_INFINITY : Math.max(0, Math.floor(maxTags));\n\tconst isEditingDisabled = disabled || readOnly;\n\tconst ariaDescribedBy = joinTagInputAriaIds(describedBy, externalAriaDescribedBy);\n\tconst ariaLabelledBy = joinTagInputAriaIds(labelId, externalAriaLabelledBy);\n\n\tuseImperativeHandle(ref, () => {\n\t\tconst input = inputRef.current;\n\n\t\tif (!input) {\n\t\t\tthrow new Error(\"TagInput: внутренний input недоступен при создании imperative handle.\");\n\t\t}\n\n\t\treturn input;\n\t}, []);\n\n\t/** Добавляет сразу несколько кандидатов одним controlled-обновлением и сообщает результат screen reader. */\n\tconst appendTags = (rawTags: readonly string[]) => {\n\t\tif (isEditingDisabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tonClearError?.();\n\n\t\tconst nextTags = [...value];\n\t\tconst knownKeys = new Set(nextTags.map((tag) => getTagKey(tag)));\n\t\tconst added: string[] = [];\n\t\tlet duplicateCount = 0;\n\t\tlet limitReached = false;\n\n\t\tfor (const rawTag of rawTags) {\n\t\t\tconst tag = normalizeTag(rawTag);\n\n\t\t\tif (!tag) continue;\n\n\t\t\tif (maxLength !== undefined && tag.length > maxLength) {\n\t\t\t\tsetAnnouncement(`Тег «${tag}» длиннее допустимого значения.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst key = getTagKey(tag);\n\n\t\t\tif (knownKeys.has(key)) {\n\t\t\t\tduplicateCount += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (nextTags.length >= resolvedMaxTags) {\n\t\t\t\tlimitReached = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tknownKeys.add(key);\n\t\t\tnextTags.push(tag);\n\t\t\tadded.push(tag);\n\t\t}\n\n\t\tif (added.length > 0) {\n\t\t\tonChange(nextTags);\n\t\t\tsetAnnouncement(added.length === 1 ? `Добавлен тег «${added[0]}».` : `Добавлено тегов: ${added.length}.`);\n\t\t} else if (limitReached) {\n\t\t\tsetAnnouncement(`Достигнуто максимальное количество тегов: ${resolvedMaxTags}.`);\n\t\t} else if (duplicateCount > 0) {\n\t\t\tsetAnnouncement(\"Такой тег уже добавлен.\");\n\t\t}\n\t};\n\n\tconst commitDraft = () => {\n\t\tif (!draft) return false;\n\n\t\tappendTags(draft.split(TAG_DELIMITER_SPLIT_PATTERN));\n\t\tsetDraft(\"\");\n\t\treturn true;\n\t};\n\n\tconst removeTag = (index: number) => {\n\t\tif (isEditingDisabled) return;\n\n\t\tconst removedTag = value[index];\n\t\tif (removedTag === undefined) return;\n\n\t\tonChange(value.filter((_, currentIndex) => currentIndex !== index));\n\t\tonClearError?.();\n\t\tsetAnnouncement(`Удалён тег «${removedTag}».`);\n\t\tinputRef.current?.focus();\n\t};\n\n\tconst handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n\t\tonKeyDown?.(event);\n\t\tif (event.defaultPrevented || event.nativeEvent.isComposing || isComposingRef.current || isEditingDisabled) return;\n\n\t\tif (event.key === \"Enter\" || event.key === \",\") {\n\t\t\tif (commitDraft() || event.key === \",\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"Backspace\" && draft.length === 0 && value.length > 0) {\n\t\t\tevent.preventDefault();\n\t\t\tremoveTag(value.length - 1);\n\t\t}\n\t};\n\n\tconst handlePaste = (event: ClipboardEvent<HTMLInputElement>) => {\n\t\tonPaste?.(event);\n\t\tif (event.defaultPrevented || isEditingDisabled) return;\n\n\t\tconst clipboardText = event.clipboardData.getData(\"text\");\n\t\tif (!TAG_DELIMITER_PATTERN.test(clipboardText)) return;\n\n\t\tevent.preventDefault();\n\t\tconst selectionStart = event.currentTarget.selectionStart ?? draft.length;\n\t\tconst selectionEnd = event.currentTarget.selectionEnd ?? selectionStart;\n\t\tconst pastedValue = `${draft.slice(0, selectionStart)}${clipboardText}${draft.slice(selectionEnd)}`;\n\n\t\tappendTags(pastedValue.split(TAG_DELIMITER_SPLIT_PATTERN));\n\t\tsetDraft(\"\");\n\t};\n\n\treturn (\n\t\t<InputUI\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tclassName={className}\n\t\t\tsize={size}\n\t\t\terror={error}\n\t\t\tcontrolId={controlId}\n\t\t\tlabelId={labelId}\n\t\t\tdescriptionId={descriptionId}\n\t\t\terrorId={errorId}>\n\t\t\t<div\n\t\t\t\tref={controlRef}\n\t\t\t\tclassName={cn(uiStyles.uiControl, error && uiStyles.invalid, styles.control)}\n\t\t\t\tdata-disabled={disabled ? \"\" : undefined}\n\t\t\t\tdata-readonly={readOnly ? \"\" : undefined}\n\t\t\t\tdata-invalid={error ? \"\" : undefined}\n\t\t\t\tonClick={() => inputRef.current?.focus()}>\n\t\t\t\t{value.length > 0 && (\n\t\t\t\t\t<ul className={styles.tagList} aria-label={tokensAriaLabel}>\n\t\t\t\t\t\t{value.map((tag, index) => (\n\t\t\t\t\t\t\t<li className={styles.tag} key={`${getTagKey(tag)}-${index}`}>\n\t\t\t\t\t\t\t\t<span className={styles.tagText}>{tag}</span>\n\t\t\t\t\t\t\t\t{!isEditingDisabled && (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclassName={styles.removeButton}\n\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\tremoveTag(index);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\taria-label={getRemoveButtonAriaLabel(tag, index)}>\n\t\t\t\t\t\t\t\t\t\t<XIcon aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ul>\n\t\t\t\t)}\n\n\t\t\t\t<input\n\t\t\t\t\t{...inputProps}\n\t\t\t\t\tref={inputRef}\n\t\t\t\t\tid={controlId}\n\t\t\t\t\tform={form}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\trequired={required && value.length === 0}\n\t\t\t\t\tmaxLength={maxLength}\n\t\t\t\t\tvalue={draft}\n\t\t\t\t\tplaceholder={value.length === 0 ? placeholder : undefined}\n\t\t\t\t\taria-invalid={!!error || undefined}\n\t\t\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\tclassName={cn(styles.input, inputClassName)}\n\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\tconst nextDraft = event.target.value;\n\t\t\t\t\t\tconst hasDelimiter = TAG_DELIMITER_PATTERN.test(nextDraft);\n\n\t\t\t\t\t\tif (isComposingRef.current) {\n\t\t\t\t\t\t\tsetDraft(nextDraft);\n\t\t\t\t\t\t} else if (hasDelimiter) {\n\t\t\t\t\t\t\tconst parts = nextDraft.split(TAG_DELIMITER_SPLIT_PATTERN);\n\t\t\t\t\t\t\tconst hasTrailingDelimiter = TAG_DELIMITER_PATTERN.test(nextDraft.at(-1) ?? \"\");\n\t\t\t\t\t\t\tconst uncommittedPart = hasTrailingDelimiter ? \"\" : (parts.pop() ?? \"\");\n\n\t\t\t\t\t\t\tappendTags(parts);\n\t\t\t\t\t\t\tsetDraft(uncommittedPart);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetDraft(nextDraft);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (isComposingRef.current || !hasDelimiter) {\n\t\t\t\t\t\t\tonClearError?.();\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\tonPaste={handlePaste}\n\t\t\t\t\tonCompositionStart={(event: CompositionEvent<HTMLInputElement>) => {\n\t\t\t\t\t\tisComposingRef.current = true;\n\t\t\t\t\t\tonCompositionStart?.(event);\n\t\t\t\t\t}}\n\t\t\t\t\tonCompositionEnd={(event: CompositionEvent<HTMLInputElement>) => {\n\t\t\t\t\t\tisComposingRef.current = false;\n\t\t\t\t\t\tonCompositionEnd?.(event);\n\t\t\t\t\t}}\n\t\t\t\t\tonBlur={(event) => {\n\t\t\t\t\t\tonBlur?.(event);\n\t\t\t\t\t\tconst nextFocusedNode = event.relatedTarget;\n\t\t\t\t\t\tconst focusRemainsInside = nextFocusedNode instanceof Node && controlRef.current?.contains(nextFocusedNode);\n\n\t\t\t\t\t\tif (!event.defaultPrevented && !focusRemainsInside && addOnBlur && !isEditingDisabled) {\n\t\t\t\t\t\t\tcommitDraft();\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t/>\n\n\t\t\t\t{name &&\n\t\t\t\t\tvalue.map((tag, index) => (\n\t\t\t\t\t\t<input key={`${getTagKey(tag)}-${index}`} type=\"hidden\" name={name} value={tag} form={form} disabled={disabled} />\n\t\t\t\t\t))}\n\t\t\t</div>\n\n\t\t\t<span className=\"visuallyHidden\" aria-live=\"polite\" aria-atomic=\"true\">\n\t\t\t\t{announcement}\n\t\t\t</span>\n\t\t</InputUI>\n\t);\n}\n"],"mappings":"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"}
|
package/dist/text/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { n as e } from "../chunks/popover-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { n as e } from "../chunks/popover-yl5DVe06.js";
|
|
2
|
+
import { cn as t } from "@ryuzaki13/react-foundation-lib/utils";
|
|
3
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
4
|
+
import { useMemo as r } from "react";
|
|
5
5
|
import { normalizeTextWithFallback as i } from "@ryuzaki13/react-foundation-lib/formatters";
|
|
6
6
|
//#region src/text/HighlightText.tsx
|
|
7
|
-
var a = ({ text: e, highlight: t }) => t ? e.split(RegExp(`(${t})`, "gi")).map((e,
|
|
7
|
+
var a = ({ text: e, highlight: t }) => t ? e.split(RegExp(`(${t})`, "gi")).map((e, r) => e.toLowerCase() === t.toLowerCase() ? /* @__PURE__ */ n("mark", { children: e }, r) : e) : e, o = {
|
|
8
8
|
primary: "content0",
|
|
9
9
|
secondary: "content1",
|
|
10
10
|
muted: "content2",
|
|
@@ -31,34 +31,34 @@ var a = ({ text: e, highlight: t }) => t ? e.split(RegExp(`(${t})`, "gi")).map((
|
|
|
31
31
|
wrap: "textWrap",
|
|
32
32
|
noWrap: "textNoWrap"
|
|
33
33
|
};
|
|
34
|
-
function u({ size: e, color:
|
|
35
|
-
return
|
|
36
|
-
let
|
|
37
|
-
return e &&
|
|
34
|
+
function u({ size: e, color: n, weight: i, italic: a, uppercase: u, wrap: d, className: f }) {
|
|
35
|
+
return r(() => {
|
|
36
|
+
let r = [];
|
|
37
|
+
return e && r.push(s[e]), i && r.push(c[i]), d && r.push(l[d]), a && r.push("fontItalic"), u && r.push("textUppercase"), n && r.push(o[n]), t(...r, f);
|
|
38
38
|
}, [
|
|
39
39
|
e,
|
|
40
40
|
i,
|
|
41
|
-
|
|
41
|
+
n,
|
|
42
42
|
a,
|
|
43
43
|
u,
|
|
44
44
|
d,
|
|
45
45
|
f
|
|
46
46
|
]);
|
|
47
47
|
}
|
|
48
|
-
function d({ children: e, as: t, style:
|
|
48
|
+
function d({ children: e, as: t, style: r, role: i, ...a }) {
|
|
49
49
|
let o = u(a);
|
|
50
|
-
return /* @__PURE__ */
|
|
50
|
+
return /* @__PURE__ */ n(t || "span", {
|
|
51
51
|
role: i,
|
|
52
52
|
className: o,
|
|
53
|
-
style:
|
|
53
|
+
style: r,
|
|
54
54
|
children: e
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
//#endregion
|
|
58
58
|
//#region src/text/TextOverflow.tsx
|
|
59
|
-
function f({ maxChar: t, placement:
|
|
59
|
+
function f({ maxChar: t, placement: r = "left", closeDelay: a = 0, maxWidth: o, children: s, block: c, state: l, textWrap: u, textWrapProps: d }) {
|
|
60
60
|
let f = i(s);
|
|
61
|
-
if (!f.length || t && f.length < t) return /* @__PURE__ */
|
|
61
|
+
if (!f.length || t && f.length < t) return /* @__PURE__ */ n("span", { children: f });
|
|
62
62
|
let p = u ?? "div", m = {
|
|
63
63
|
style: {
|
|
64
64
|
display: c ? "block" : "inline-block",
|
|
@@ -74,14 +74,14 @@ function f({ maxChar: t, placement: n = "left", closeDelay: a = 0, maxWidth: o,
|
|
|
74
74
|
},
|
|
75
75
|
className: [d?.className, m.className].filter(Boolean).join(" ")
|
|
76
76
|
};
|
|
77
|
-
return /* @__PURE__ */
|
|
77
|
+
return /* @__PURE__ */ n(e, {
|
|
78
78
|
state: l,
|
|
79
|
-
placement:
|
|
79
|
+
placement: r,
|
|
80
80
|
openOnHover: !0,
|
|
81
81
|
content: f,
|
|
82
82
|
closeDelay: a,
|
|
83
83
|
maxWidth: o,
|
|
84
|
-
children: /* @__PURE__ */
|
|
84
|
+
children: /* @__PURE__ */ n(p, {
|
|
85
85
|
...h,
|
|
86
86
|
children: f
|
|
87
87
|
})
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { m as e } from "../chunks/misc-
|
|
2
|
-
import { a as t, n, t as r } from "../chunks/types-
|
|
1
|
+
import { m as e } from "../chunks/misc-CGQOXXCy.js";
|
|
2
|
+
import { a as t, n, t as r } from "../chunks/types-CxXyru6U.js";
|
|
3
3
|
import { jsx as i } from "react/jsx-runtime";
|
|
4
4
|
//#region src/text-editor/TextEditorLexical.tsx
|
|
5
5
|
function a() {
|
|
6
|
-
return import("../chunks/TextEditorLexicalClient-
|
|
6
|
+
return import("../chunks/TextEditorLexicalClient-BRp8jHId.js").then((e) => ({ TextEditorLexicalClient: e.TextEditorLexicalClient }));
|
|
7
7
|
}
|
|
8
8
|
function o(t) {
|
|
9
9
|
return /* @__PURE__ */ i(e, {
|
package/dist/textarea/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as e } from "../chunks/ui.module-oRwY3Zli.js";
|
|
2
|
-
import { c as t, d as n } from "../chunks/input-
|
|
2
|
+
import { c as t, d as n } from "../chunks/input-CuRK9Vbz.js";
|
|
3
3
|
import { cn as r } from "@ryuzaki13/react-foundation-lib/utils";
|
|
4
4
|
import { jsx as i } from "react/jsx-runtime";
|
|
5
5
|
var a = { textarea: "TjY2iu" };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { Component as t, useEffect as n } from "react";
|
|
3
3
|
import { disableThreeSceneForSession as r, threeSceneDefaultDisabledStorageKey as i, useThreeSceneAvailability as a } from "@ryuzaki13/react-foundation-lib/three-scene";
|
|
4
4
|
//#region src/three-scene/ThreeSceneErrorBoundary.tsx
|
|
5
|
-
var o = class extends
|
|
5
|
+
var o = class extends t {
|
|
6
6
|
state = { hasError: !1 };
|
|
7
7
|
static getDerivedStateFromError() {
|
|
8
8
|
return { hasError: !0 };
|
|
@@ -16,20 +16,20 @@ var o = class extends e {
|
|
|
16
16
|
};
|
|
17
17
|
//#endregion
|
|
18
18
|
//#region src/three-scene/ThreeSceneGuard.tsx
|
|
19
|
-
function s({ children:
|
|
19
|
+
function s({ children: t, fallback: s, disabledStorageKey: c = i, disableWhenReducedMotion: l, webGLVersion: u, onError: d, onAvailabilityChange: f }) {
|
|
20
20
|
let p = a({
|
|
21
21
|
disabledStorageKey: c,
|
|
22
22
|
disableWhenReducedMotion: l,
|
|
23
23
|
webGLVersion: u
|
|
24
24
|
});
|
|
25
|
-
return
|
|
25
|
+
return n(() => {
|
|
26
26
|
f?.(p);
|
|
27
|
-
}, [p, f]), p.status === "available" ? /* @__PURE__ */
|
|
27
|
+
}, [p, f]), p.status === "available" ? /* @__PURE__ */ e(o, {
|
|
28
28
|
fallback: s,
|
|
29
29
|
onError: (e, t) => {
|
|
30
30
|
r(c), d?.(e, t);
|
|
31
31
|
},
|
|
32
|
-
children:
|
|
32
|
+
children: t
|
|
33
33
|
}) : s;
|
|
34
34
|
}
|
|
35
35
|
//#endregion
|
package/dist/toggle/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as e } from "../chunks/ui.module-oRwY3Zli.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { cn as t } from "@ryuzaki13/react-foundation-lib/utils";
|
|
3
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
import { useId as i } from "react";
|
|
5
5
|
//#region src/toggle/stringToggleState.ts
|
|
6
6
|
var a = "true", o = "false";
|
|
7
7
|
function s(e, t) {
|
|
@@ -20,21 +20,21 @@ var c = {
|
|
|
20
20
|
//#endregion
|
|
21
21
|
//#region src/toggle/Toggle.tsx
|
|
22
22
|
function l({ label: a, description: o, placeholder: s, disabled: l, size: u, className: d, onChange: f, value: p, id: m, checkedText: h = "ВКЛ", uncheckedText: g = "ВЫКЛ", labelPosition: _ = "before", ...v }) {
|
|
23
|
-
let y =
|
|
23
|
+
let y = i(), b = m ?? y, x = o ? `${b}-description` : void 0, S = a ?? s, C = !!p, w = !S && !v["aria-label"] ? `${g} / ${h}` : void 0, T = S ? /* @__PURE__ */ n("label", {
|
|
24
24
|
htmlFor: b,
|
|
25
25
|
className: e.uiLabel,
|
|
26
26
|
children: S
|
|
27
27
|
}) : null;
|
|
28
|
-
return /* @__PURE__ */
|
|
29
|
-
className:
|
|
28
|
+
return /* @__PURE__ */ r("div", {
|
|
29
|
+
className: t(e.uiElement, l && e.disabled, u && e.uiSizable, u && e[u], d),
|
|
30
30
|
"aria-disabled": l || void 0,
|
|
31
|
-
children: [/* @__PURE__ */
|
|
31
|
+
children: [/* @__PURE__ */ r("div", {
|
|
32
32
|
className: c.row,
|
|
33
33
|
children: [
|
|
34
34
|
_ === "before" && T,
|
|
35
|
-
/* @__PURE__ */
|
|
35
|
+
/* @__PURE__ */ r("div", {
|
|
36
36
|
className: c.wrapper,
|
|
37
|
-
children: [/* @__PURE__ */
|
|
37
|
+
children: [/* @__PURE__ */ n("input", {
|
|
38
38
|
...v,
|
|
39
39
|
id: b,
|
|
40
40
|
type: "checkbox",
|
|
@@ -44,20 +44,20 @@ function l({ label: a, description: o, placeholder: s, disabled: l, size: u, cla
|
|
|
44
44
|
"aria-checked": C,
|
|
45
45
|
"aria-describedby": x,
|
|
46
46
|
"aria-label": w,
|
|
47
|
-
className:
|
|
47
|
+
className: t(e.uiInputControl, c.input),
|
|
48
48
|
onChange: (e) => f?.(e.currentTarget.checked)
|
|
49
|
-
}), /* @__PURE__ */
|
|
49
|
+
}), /* @__PURE__ */ r("div", {
|
|
50
50
|
className: c.track,
|
|
51
51
|
"data-disabled": l || void 0,
|
|
52
52
|
"aria-hidden": "true",
|
|
53
53
|
children: [
|
|
54
|
-
/* @__PURE__ */
|
|
55
|
-
/* @__PURE__ */
|
|
56
|
-
className:
|
|
54
|
+
/* @__PURE__ */ n("div", { className: c.thumb }),
|
|
55
|
+
/* @__PURE__ */ n("div", {
|
|
56
|
+
className: t(c.option, c.unchecked),
|
|
57
57
|
children: g
|
|
58
58
|
}),
|
|
59
|
-
/* @__PURE__ */
|
|
60
|
-
className:
|
|
59
|
+
/* @__PURE__ */ n("div", {
|
|
60
|
+
className: t(c.option, c.checked),
|
|
61
61
|
children: h
|
|
62
62
|
})
|
|
63
63
|
]
|
|
@@ -65,7 +65,7 @@ function l({ label: a, description: o, placeholder: s, disabled: l, size: u, cla
|
|
|
65
65
|
}),
|
|
66
66
|
_ === "after" && T
|
|
67
67
|
]
|
|
68
|
-
}), o && /* @__PURE__ */
|
|
68
|
+
}), o && /* @__PURE__ */ n("p", {
|
|
69
69
|
id: x,
|
|
70
70
|
className: e.uiDescription,
|
|
71
71
|
children: o
|
|
@@ -74,9 +74,9 @@ function l({ label: a, description: o, placeholder: s, disabled: l, size: u, cla
|
|
|
74
74
|
}
|
|
75
75
|
//#endregion
|
|
76
76
|
//#region src/toggle/StringToggle.tsx
|
|
77
|
-
function u({ value: e, onChange: t, checkedValue:
|
|
78
|
-
let d = s(
|
|
79
|
-
return /* @__PURE__ */
|
|
77
|
+
function u({ value: e, onChange: t, checkedValue: r, uncheckedValue: i, defaultChecked: c, ...u }) {
|
|
78
|
+
let d = s(r, a), f = s(i, o), p = e === d;
|
|
79
|
+
return /* @__PURE__ */ n(l, {
|
|
80
80
|
...u,
|
|
81
81
|
value: p,
|
|
82
82
|
onChange: (e) => t(e ? d : f)
|
package/dist/toolbar/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { r as e, t } from "../chunks/flex-
|
|
1
|
+
import { r as e, t } from "../chunks/flex-DtXK7OM4.js";
|
|
2
2
|
import { t as n } from "../chunks/grid-dI94AAbi.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { childrenCount as r } from "@ryuzaki13/react-foundation-lib/utils";
|
|
4
|
+
import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
5
|
+
import { Children as s } from "react";
|
|
6
6
|
//#region src/toolbar/Toolbar.tsx
|
|
7
|
-
var c = ({ children: e }) => /* @__PURE__ */
|
|
7
|
+
var c = ({ children: e }) => /* @__PURE__ */ a(i, { children: e });
|
|
8
8
|
c.displayName = "Toolbar.Start";
|
|
9
|
-
var l = ({ children: e }) => /* @__PURE__ */
|
|
9
|
+
var l = ({ children: e }) => /* @__PURE__ */ a(i, { children: e });
|
|
10
10
|
l.displayName = "Toolbar.End";
|
|
11
|
-
function u({ children:
|
|
12
|
-
let d = null, f = null, p =
|
|
11
|
+
function u({ children: i, className: u }) {
|
|
12
|
+
let d = null, f = null, p = s.toArray(i);
|
|
13
13
|
for (let e of p) switch (e.type.displayName) {
|
|
14
14
|
case c.displayName:
|
|
15
15
|
if (d) throw Error("Toolbar: duplicate <ToolbarStart> found");
|
|
@@ -19,26 +19,26 @@ function u({ children: a, className: u }) {
|
|
|
19
19
|
if (f) throw Error("Toolbar: duplicate <ToolbarEnd> found");
|
|
20
20
|
f = e.props.children;
|
|
21
21
|
}
|
|
22
|
-
return /* @__PURE__ */
|
|
22
|
+
return /* @__PURE__ */ o(e.Container, {
|
|
23
23
|
wrap: !0,
|
|
24
24
|
align: "center",
|
|
25
25
|
gap: "md",
|
|
26
26
|
className: u,
|
|
27
27
|
children: [
|
|
28
|
-
d && /* @__PURE__ */
|
|
28
|
+
d && /* @__PURE__ */ a(e.Item, {
|
|
29
29
|
flex0: !0,
|
|
30
|
-
children: /* @__PURE__ */
|
|
31
|
-
templateColumns: `repeat(${
|
|
30
|
+
children: /* @__PURE__ */ a(n.Container, {
|
|
31
|
+
templateColumns: `repeat(${r(d)}, calc(15em + var(--width-add)))`,
|
|
32
32
|
align: "end",
|
|
33
33
|
gap: "sm",
|
|
34
34
|
children: d
|
|
35
35
|
})
|
|
36
36
|
}),
|
|
37
|
-
/* @__PURE__ */
|
|
38
|
-
f && /* @__PURE__ */
|
|
37
|
+
/* @__PURE__ */ a(t, {}),
|
|
38
|
+
f && /* @__PURE__ */ a(e.Item, {
|
|
39
39
|
flex0: !0,
|
|
40
|
-
children: /* @__PURE__ */
|
|
41
|
-
templateColumns: `repeat(${
|
|
40
|
+
children: /* @__PURE__ */ a(n.Container, {
|
|
41
|
+
templateColumns: `repeat(${r(f)}, calc(15em + var(--width-add)))`,
|
|
42
42
|
align: "end",
|
|
43
43
|
gap: "sm",
|
|
44
44
|
children: f
|
package/dist/tree/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { cn as e, handleKeyboardActivation as t } from "@ryuzaki13/react-foundation-lib/utils";
|
|
2
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
3
|
+
import { createElement as i, useMemo as a } from "react";
|
|
4
4
|
var o = {
|
|
5
5
|
nodeItem: "yJlLGL",
|
|
6
6
|
treeContainer: "lWEMr2",
|
|
@@ -11,14 +11,14 @@ function c(e, t) {
|
|
|
11
11
|
return e.id ?? e.key ?? t;
|
|
12
12
|
}
|
|
13
13
|
function l({ node: e, level: t }) {
|
|
14
|
-
let
|
|
15
|
-
return typeof
|
|
14
|
+
let r = e.title ?? e.text ?? e.label;
|
|
15
|
+
return typeof r == "string" || typeof r == "number" ? /* @__PURE__ */ n("div", {
|
|
16
16
|
"aria-level": t + 1,
|
|
17
17
|
style: { display: "inline-block" },
|
|
18
|
-
children:
|
|
19
|
-
}) : /* @__PURE__ */
|
|
18
|
+
children: r
|
|
19
|
+
}) : /* @__PURE__ */ n("div", {
|
|
20
20
|
"aria-level": t + 1,
|
|
21
|
-
children: JSON.stringify(
|
|
21
|
+
children: JSON.stringify(r ?? e)
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
24
|
function u(u) {
|
|
@@ -26,32 +26,32 @@ function u(u) {
|
|
|
26
26
|
if (typeof p == "function") return p(e);
|
|
27
27
|
let t = e[f];
|
|
28
28
|
return Array.isArray(t) ? t : void 0;
|
|
29
|
-
}, O = (
|
|
30
|
-
let d = D(
|
|
31
|
-
node:
|
|
29
|
+
}, O = (a, s, c, u) => {
|
|
30
|
+
let d = D(a), f = Array.isArray(d) && d.length > 0, p = !f, v = typeof h == "function" ? h({
|
|
31
|
+
node: a,
|
|
32
32
|
level: c,
|
|
33
33
|
hasChildren: f,
|
|
34
34
|
isLeaf: p,
|
|
35
35
|
path: u
|
|
36
36
|
}) : l({
|
|
37
|
-
node:
|
|
37
|
+
node: a,
|
|
38
38
|
level: c,
|
|
39
39
|
hasChildren: f,
|
|
40
40
|
isLeaf: p,
|
|
41
41
|
path: u
|
|
42
42
|
});
|
|
43
43
|
function y() {
|
|
44
|
-
let e = /* @__PURE__ */
|
|
44
|
+
let e = /* @__PURE__ */ n("div", {
|
|
45
45
|
className: T,
|
|
46
46
|
style: E,
|
|
47
47
|
"aria-current": p ? void 0 : !1,
|
|
48
48
|
children: v
|
|
49
49
|
});
|
|
50
|
-
return g ? /* @__PURE__ */
|
|
50
|
+
return g ? /* @__PURE__ */ n("button", {
|
|
51
51
|
type: "button",
|
|
52
|
-
onClick: () => g(
|
|
52
|
+
onClick: () => g(a, u),
|
|
53
53
|
onKeyDown: (e) => {
|
|
54
|
-
|
|
54
|
+
t(e, () => g(a, u));
|
|
55
55
|
},
|
|
56
56
|
"data-ui": "tree-node-button",
|
|
57
57
|
"data-action": "select-tree-node",
|
|
@@ -63,20 +63,20 @@ function u(u) {
|
|
|
63
63
|
cursor: "pointer"
|
|
64
64
|
},
|
|
65
65
|
children: e
|
|
66
|
-
}) : /* @__PURE__ */
|
|
66
|
+
}) : /* @__PURE__ */ n("div", {
|
|
67
67
|
role: "presentation",
|
|
68
68
|
children: e
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
|
-
return /* @__PURE__ */
|
|
72
|
-
className:
|
|
71
|
+
return /* @__PURE__ */ r("li", {
|
|
72
|
+
className: e(o.nodeItem, x),
|
|
73
73
|
style: S,
|
|
74
|
-
children: [/* @__PURE__ */
|
|
74
|
+
children: [/* @__PURE__ */ n(y, {}), f && i(_, {
|
|
75
75
|
className: C ?? o.nestedList,
|
|
76
76
|
style: w
|
|
77
77
|
}, d.map((e, t) => O(e, t, c + 1, [...u, t])))]
|
|
78
|
-
}, m(
|
|
79
|
-
}, k =
|
|
78
|
+
}, m(a, s, u));
|
|
79
|
+
}, k = a(() => d.map((e, t) => O(e, t, 0, [t])), [
|
|
80
80
|
d,
|
|
81
81
|
f,
|
|
82
82
|
p,
|
|
@@ -91,8 +91,8 @@ function u(u) {
|
|
|
91
91
|
T,
|
|
92
92
|
E
|
|
93
93
|
]);
|
|
94
|
-
return
|
|
95
|
-
className:
|
|
94
|
+
return i(_, {
|
|
95
|
+
className: e(v ?? o.treeContainer, b && o.nestedСounter),
|
|
96
96
|
style: y
|
|
97
97
|
}, k);
|
|
98
98
|
}
|