@crewlethq/ui 0.43.0 → 0.44.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/README.md +10 -0
- package/dist/AgentHandoffPanel/index.js +2 -2
- package/dist/ArrangeFrame/index.js +2 -2
- package/dist/ArrangeList/index.js +1 -1
- package/dist/AvatarPicker/index.js +3 -3
- package/dist/CatalogTile/CatalogTile.d.ts +12 -1
- package/dist/CatalogTile/index.d.ts +1 -1
- package/dist/CatalogTile/index.js +1 -1
- package/dist/{CatalogTile-XL4XLFUH.css → CatalogTile-VPSLCKJE.css} +55 -0
- package/dist/CharacterPicker/index.js +2 -2
- package/dist/CommentThread/index.js +2 -2
- package/dist/DataView/index.js +2 -2
- package/dist/DatasetSource/index.js +1 -1
- package/dist/DirectoryList/DirectoryList.d.ts +9 -4
- package/dist/DirectoryList/index.js +1 -1
- package/dist/{DirectoryList-EESYMH2U.css → DirectoryList-7OXXN47X.css} +30 -7
- package/dist/DocTabsEditor/index.js +1 -1
- package/dist/ListInput/index.js +2 -2
- package/dist/RichEditor/index.js +1 -1
- package/dist/Section/Section.d.ts +6 -0
- package/dist/Section/index.js +1 -1
- package/dist/{Section-O5AHGSOG.css → Section-M7SG6NP2.css} +14 -0
- package/dist/SheetGrid/index.js +5 -5
- package/dist/SlideFilmstrip/index.js +1 -1
- package/dist/Switcher/index.js +2 -2
- package/dist/TableCells/index.js +1 -1
- package/dist/TagsInput/index.js +2 -2
- package/dist/{chunk-SJ6DMG4R.js → chunk-4AA6WPQU.js} +1 -1
- package/dist/{chunk-PCT47E7O.js → chunk-5GNA4RKP.js} +36 -1
- package/dist/{chunk-3TFDQLW3.js → chunk-JQ7IFSF6.js} +1 -1
- package/dist/{chunk-BO7Q6JP6.js → chunk-N3SHQ3VU.js} +1 -1
- package/dist/{chunk-PLLYOPS4.js → chunk-Q7HLZH32.js} +1 -1
- package/dist/{chunk-JF3TJUBU.js → chunk-TVSHR35W.js} +1 -1
- package/dist/generated/index.js +40 -40
- package/dist/index.js +40 -40
- package/dist/styles.css +102 -10
- package/package.json +3 -3
- package/dist/{Editor-AMO2B54T.js → Editor-FXO2JVWK.js} +1 -1
- package/dist/{chunk-NCM73C34.js → chunk-AACPFUZW.js} +1 -1
- package/dist/{chunk-524GGA67.js → chunk-NF6SWHQI.js} +1 -1
- package/dist/{chunk-Z5WMCBHR.js → chunk-NMYGJJJK.js} +1 -1
- package/dist/{chunk-AGNZIT3Z.js → chunk-NVMZQ3Y4.js} +1 -1
- package/dist/{chunk-OVHJTOKW.js → chunk-OWIGEE2Y.js} +2 -2
- package/dist/{chunk-VZICPYGR.js → chunk-SNQRGH4A.js} +1 -1
- package/dist/{chunk-IVAR7NRW.js → chunk-SXBJMBSV.js} +1 -1
- package/dist/{chunk-LKBZV5IT.js → chunk-VWYT3GVV.js} +1 -1
package/dist/styles.css
CHANGED
|
@@ -6958,7 +6958,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
|
|
|
6958
6958
|
}
|
|
6959
6959
|
|
|
6960
6960
|
|
|
6961
|
-
/* CatalogTile-
|
|
6961
|
+
/* CatalogTile-VPSLCKJE.css */
|
|
6962
6962
|
/*
|
|
6963
6963
|
* CatalogTile: mark, name and state, one sentence, and a foot with a quiet
|
|
6964
6964
|
* fact and one action.
|
|
@@ -7095,6 +7095,61 @@ a.crewlet-breadcrumb__crumb:focus-visible {
|
|
|
7095
7095
|
}
|
|
7096
7096
|
}
|
|
7097
7097
|
|
|
7098
|
+
/*
|
|
7099
|
+
* COMPACT: a summary's tile, about half the comfortable one's height. One
|
|
7100
|
+
* header line holds the mark (the row step's well, 28px), the name, its state
|
|
7101
|
+
* and its fact, and the action at the end; the sentence is one line under it,
|
|
7102
|
+
* aligned to the name, cut to fit. No reserve and no foot, because a summary
|
|
7103
|
+
* has no row of feet to line up.
|
|
7104
|
+
*/
|
|
7105
|
+
.crewlet-catalog-tile--compact {
|
|
7106
|
+
gap: var(--spacing-1);
|
|
7107
|
+
padding: var(--spacing-3);
|
|
7108
|
+
}
|
|
7109
|
+
|
|
7110
|
+
.crewlet-catalog-tile--compact .crewlet-catalog-tile__head {
|
|
7111
|
+
align-items: center;
|
|
7112
|
+
gap: var(--spacing-2);
|
|
7113
|
+
}
|
|
7114
|
+
|
|
7115
|
+
.crewlet-catalog-tile--compact .crewlet-catalog-tile__mark {
|
|
7116
|
+
width: var(--size-row-sm);
|
|
7117
|
+
height: var(--size-row-sm);
|
|
7118
|
+
}
|
|
7119
|
+
|
|
7120
|
+
.crewlet-catalog-tile--compact .crewlet-catalog-tile__title {
|
|
7121
|
+
flex: 1 1 auto;
|
|
7122
|
+
flex-direction: row;
|
|
7123
|
+
align-items: center;
|
|
7124
|
+
gap: var(--spacing-2);
|
|
7125
|
+
padding-top: 0;
|
|
7126
|
+
}
|
|
7127
|
+
|
|
7128
|
+
.crewlet-catalog-tile--compact .crewlet-catalog-tile__name {
|
|
7129
|
+
flex: 0 1 auto;
|
|
7130
|
+
min-width: 0;
|
|
7131
|
+
overflow: hidden;
|
|
7132
|
+
text-overflow: ellipsis;
|
|
7133
|
+
white-space: nowrap;
|
|
7134
|
+
}
|
|
7135
|
+
|
|
7136
|
+
.crewlet-catalog-tile--compact .crewlet-catalog-tile__status {
|
|
7137
|
+
flex: none;
|
|
7138
|
+
}
|
|
7139
|
+
|
|
7140
|
+
.crewlet-catalog-tile--compact .crewlet-catalog-tile__meta {
|
|
7141
|
+
flex: 0 1 auto;
|
|
7142
|
+
}
|
|
7143
|
+
|
|
7144
|
+
.crewlet-catalog-tile--compact .crewlet-catalog-tile__description {
|
|
7145
|
+
flex: none;
|
|
7146
|
+
min-height: 0;
|
|
7147
|
+
padding-left: calc(var(--size-row-sm) + var(--spacing-2));
|
|
7148
|
+
overflow: hidden;
|
|
7149
|
+
text-overflow: ellipsis;
|
|
7150
|
+
white-space: nowrap;
|
|
7151
|
+
}
|
|
7152
|
+
|
|
7098
7153
|
|
|
7099
7154
|
/* ChangeMark-3VMTW7MT.css */
|
|
7100
7155
|
/*
|
|
@@ -13725,7 +13780,7 @@ svg.crewlet-datetime__chevron {
|
|
|
13725
13780
|
}
|
|
13726
13781
|
|
|
13727
13782
|
|
|
13728
|
-
/* DirectoryList-
|
|
13783
|
+
/* DirectoryList-7OXXN47X.css */
|
|
13729
13784
|
/*
|
|
13730
13785
|
* DirectoryList: named groups of links, each line a mark, a label and a state,
|
|
13731
13786
|
* and one foot that holds the bottom (DirectoryList.tsx).
|
|
@@ -13750,7 +13805,9 @@ svg.crewlet-datetime__chevron {
|
|
|
13750
13805
|
display: flex;
|
|
13751
13806
|
flex: 1 1 auto;
|
|
13752
13807
|
flex-direction: column;
|
|
13753
|
-
|
|
13808
|
+
/* One small step between groups, so a heading reads as the head of the lines
|
|
13809
|
+
under it rather than a band between two runs of them. */
|
|
13810
|
+
gap: var(--spacing-3);
|
|
13754
13811
|
min-height: 0;
|
|
13755
13812
|
overflow-y: auto;
|
|
13756
13813
|
}
|
|
@@ -13781,16 +13838,24 @@ svg.crewlet-datetime__chevron {
|
|
|
13781
13838
|
list-style: none;
|
|
13782
13839
|
}
|
|
13783
13840
|
|
|
13841
|
+
/*
|
|
13842
|
+
* THE RAIL'S ROW STEP, 30px (--size-nav-row): a directory is navigation beside
|
|
13843
|
+
* the page as the rail is beside the app, so its lines stand at the rail's
|
|
13844
|
+
* height and in its compact type. Everything a line says fits that one line:
|
|
13845
|
+
* a mark the size of the rail's glyph box, the hint inline after the label,
|
|
13846
|
+
* and the state compact at the end.
|
|
13847
|
+
*/
|
|
13784
13848
|
.crewlet-directory__item {
|
|
13785
13849
|
display: grid;
|
|
13786
13850
|
grid-template-columns: auto minmax(0, 1fr) auto;
|
|
13787
13851
|
align-items: center;
|
|
13788
13852
|
gap: var(--spacing-2);
|
|
13789
|
-
|
|
13790
|
-
padding:
|
|
13853
|
+
height: var(--size-nav-row);
|
|
13854
|
+
padding: 0 var(--spacing-2);
|
|
13791
13855
|
border-radius: var(--radius-md);
|
|
13792
13856
|
color: var(--color-text-primary);
|
|
13793
|
-
font-size: var(--font-size-
|
|
13857
|
+
font-size: var(--font-size-compact);
|
|
13858
|
+
line-height: var(--font-line-height-tight);
|
|
13794
13859
|
text-decoration: none;
|
|
13795
13860
|
}
|
|
13796
13861
|
|
|
@@ -13808,22 +13873,28 @@ svg.crewlet-datetime__chevron {
|
|
|
13808
13873
|
outline-offset: 1px;
|
|
13809
13874
|
}
|
|
13810
13875
|
|
|
13876
|
+
/* The box takes its mark, as the rail's glyph box does: a mark at the glyph's
|
|
13877
|
+
own step (16px, `md`) sits in the row with room to spare. */
|
|
13811
13878
|
.crewlet-directory__mark {
|
|
13812
13879
|
display: inline-flex;
|
|
13813
13880
|
flex: none;
|
|
13814
13881
|
align-items: center;
|
|
13815
13882
|
justify-content: center;
|
|
13816
|
-
width: var(--size-row-sm);
|
|
13817
|
-
height: var(--size-row-sm);
|
|
13818
13883
|
}
|
|
13819
13884
|
|
|
13885
|
+
/* ONE LINE: the label, then the hint after it in the quiet ink. The hint gives
|
|
13886
|
+
way first, so a narrow column cuts "Atlassian" before it cuts "Confluence". */
|
|
13820
13887
|
.crewlet-directory__text {
|
|
13821
13888
|
display: flex;
|
|
13822
|
-
|
|
13889
|
+
align-items: baseline;
|
|
13890
|
+
gap: var(--spacing-1);
|
|
13823
13891
|
min-width: 0;
|
|
13824
13892
|
}
|
|
13825
13893
|
|
|
13826
13894
|
.crewlet-directory__label {
|
|
13895
|
+
flex: 0 0 auto;
|
|
13896
|
+
max-width: 100%;
|
|
13897
|
+
min-width: 0;
|
|
13827
13898
|
overflow: hidden;
|
|
13828
13899
|
font-weight: var(--font-weight-medium);
|
|
13829
13900
|
text-overflow: ellipsis;
|
|
@@ -13831,6 +13902,8 @@ svg.crewlet-datetime__chevron {
|
|
|
13831
13902
|
}
|
|
13832
13903
|
|
|
13833
13904
|
.crewlet-directory__hint {
|
|
13905
|
+
flex: 0 1 auto;
|
|
13906
|
+
min-width: 0;
|
|
13834
13907
|
overflow: hidden;
|
|
13835
13908
|
font-size: var(--font-size-xs);
|
|
13836
13909
|
color: var(--color-text-tertiary);
|
|
@@ -13838,10 +13911,15 @@ svg.crewlet-datetime__chevron {
|
|
|
13838
13911
|
white-space: nowrap;
|
|
13839
13912
|
}
|
|
13840
13913
|
|
|
13914
|
+
/* THE STATE IS COMPACT: a pill or a dot and its word in the small step, held
|
|
13915
|
+
inside the row so a state never makes one line taller than the rest. */
|
|
13841
13916
|
.crewlet-directory__status {
|
|
13842
13917
|
display: inline-flex;
|
|
13843
13918
|
flex: none;
|
|
13919
|
+
align-items: center;
|
|
13920
|
+
max-height: calc(var(--size-nav-row) - var(--spacing-2));
|
|
13844
13921
|
font-size: var(--font-size-xs);
|
|
13922
|
+
line-height: 1;
|
|
13845
13923
|
color: var(--color-text-secondary);
|
|
13846
13924
|
}
|
|
13847
13925
|
|
|
@@ -23325,7 +23403,7 @@ button.crewlet-presence-stack__member:focus-visible {
|
|
|
23325
23403
|
}
|
|
23326
23404
|
|
|
23327
23405
|
|
|
23328
|
-
/* Section-
|
|
23406
|
+
/* Section-M7SG6NP2.css */
|
|
23329
23407
|
/*
|
|
23330
23408
|
* Section, the vertical rhythm band. One spacing scale keeps the cadence
|
|
23331
23409
|
* between page sections consistent, and collapses on small viewports.
|
|
@@ -23351,6 +23429,14 @@ button.crewlet-presence-stack__member:focus-visible {
|
|
|
23351
23429
|
padding-block: 0;
|
|
23352
23430
|
}
|
|
23353
23431
|
|
|
23432
|
+
/* The console band at its tightest: a group heading's step to what it names. */
|
|
23433
|
+
.crewlet-section--tight {
|
|
23434
|
+
display: flex;
|
|
23435
|
+
flex-direction: column;
|
|
23436
|
+
gap: var(--spacing-2);
|
|
23437
|
+
padding-block: 0;
|
|
23438
|
+
}
|
|
23439
|
+
|
|
23354
23440
|
.crewlet-section--sm {
|
|
23355
23441
|
padding-block: var(--spacing-9);
|
|
23356
23442
|
}
|
|
@@ -23434,6 +23520,12 @@ button.crewlet-presence-stack__member:focus-visible {
|
|
|
23434
23520
|
gap: var(--spacing-3);
|
|
23435
23521
|
}
|
|
23436
23522
|
|
|
23523
|
+
/* A tight band keeps its one small step with a title too: the titled column's
|
|
23524
|
+
gap would otherwise win, being later in the sheet. */
|
|
23525
|
+
.crewlet-section--tight.crewlet-section--titled {
|
|
23526
|
+
gap: var(--spacing-2);
|
|
23527
|
+
}
|
|
23528
|
+
|
|
23437
23529
|
@media (max-width: 768px) {
|
|
23438
23530
|
.crewlet-section--sm {
|
|
23439
23531
|
padding-block: var(--spacing-7);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crewlethq/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.44.0",
|
|
4
4
|
"description": "Crewlet shared React components built on @crewlethq/tokens and @crewlethq/icons.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"clean": "rm -rf dist src/generated"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@crewlethq/icons": "0.
|
|
46
|
-
"@crewlethq/tokens": "0.
|
|
45
|
+
"@crewlethq/icons": "0.44.0",
|
|
46
|
+
"@crewlethq/tokens": "0.44.0",
|
|
47
47
|
"prosemirror-commands": "1.7.2",
|
|
48
48
|
"prosemirror-gapcursor": "1.4.1",
|
|
49
49
|
"prosemirror-history": "1.5.1",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { schema, readMarkdown, writeMarkdown } from './chunk-QH6VYJ3X.js';
|
|
2
1
|
import { richEditorLabels } from './chunk-CSQTDGTS.js';
|
|
2
|
+
import { schema, readMarkdown, writeMarkdown } from './chunk-QH6VYJ3X.js';
|
|
3
3
|
import { safeHref, MARKDOWN_CALLOUT_TONES } from './chunk-BAKPMH3S.js';
|
|
4
4
|
import { Toolbar } from './chunk-NR4CPM4T.js';
|
|
5
5
|
import { FormField, Input } from './chunk-ZI5G5RS7.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PageHeader } from './chunk-HOXGBLEY.js';
|
|
2
|
-
import { DataTable } from './chunk-GI3S6RMM.js';
|
|
3
2
|
import { DateTimePicker } from './chunk-UFXLNC2N.js';
|
|
3
|
+
import { DataTable } from './chunk-GI3S6RMM.js';
|
|
4
4
|
import { useListbox, useOptionKeys } from './chunk-7KHM2FZH.js';
|
|
5
5
|
import { Popover } from './chunk-KHJIEPZV.js';
|
|
6
6
|
import { Toolbar } from './chunk-NR4CPM4T.js';
|
|
@@ -4,10 +4,10 @@ import { Popover } from './chunk-KHJIEPZV.js';
|
|
|
4
4
|
import { KeyChip, highlightMatch } from './chunk-FYTIJM2T.js';
|
|
5
5
|
import { Skeleton } from './chunk-TEUQWOWZ.js';
|
|
6
6
|
import { Input } from './chunk-ZI5G5RS7.js';
|
|
7
|
+
import { announce } from './chunk-RSAQOKH3.js';
|
|
7
8
|
import { useMediaMatch } from './chunk-RTPQDNW3.js';
|
|
8
9
|
import { focusables, isComposing } from './chunk-H5XTJ7GJ.js';
|
|
9
10
|
import { returnFocus } from './chunk-NUZHC6MM.js';
|
|
10
|
-
import { announce } from './chunk-RSAQOKH3.js';
|
|
11
11
|
import { VisuallyHidden } from './chunk-BZFWDIV6.js';
|
|
12
12
|
import { cx } from './chunk-ODEQTPFM.js';
|
|
13
13
|
import './Switcher-K3EPA2RB.css';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { FormField, Textarea, Input } from './chunk-ZI5G5RS7.js';
|
|
2
2
|
import { Kbd } from './chunk-SMBKXWML.js';
|
|
3
|
+
import { announce } from './chunk-RSAQOKH3.js';
|
|
3
4
|
import { isComposing } from './chunk-H5XTJ7GJ.js';
|
|
4
5
|
import { IconButton } from './chunk-LACA4JGC.js';
|
|
5
|
-
import { announce } from './chunk-RSAQOKH3.js';
|
|
6
6
|
import './ListInput-O7LJKOIG.css';
|
|
7
7
|
import { useState, useRef, useLayoutEffect } from 'react';
|
|
8
8
|
import { ArrowUpGlyph, ArrowDownGlyph, XGlyph, PlusGlyph } from '@crewlethq/icons/glyphs';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { Document } from './chunk-PWG3VHRQ.js';
|
|
1
2
|
import { PrincipalAvatar } from './chunk-CI3VPIJN.js';
|
|
2
3
|
import { toInstant, RelativeTime, formatExact, toISO } from './chunk-3CZ7XAVY.js';
|
|
3
|
-
import { Document } from './chunk-PWG3VHRQ.js';
|
|
4
4
|
import { Composer } from './chunk-7CXGSS7D.js';
|
|
5
5
|
import { Count } from './chunk-BHHIIK3M.js';
|
|
6
6
|
import { useHeadingLevel, headingTag } from './chunk-PQADV6P6.js';
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { TagGroup } from './chunk-O2EGEONV.js';
|
|
2
|
+
import { Tag } from './chunk-KYIAFNU7.js';
|
|
2
3
|
import { CursorFlag } from './chunk-3BYIWOTV.js';
|
|
3
4
|
import { presenceHueClass } from './chunk-I6POAB4V.js';
|
|
4
|
-
import { Tag } from './chunk-KYIAFNU7.js';
|
|
5
5
|
import { ChangeMark } from './chunk-66X5WDKE.js';
|
|
6
6
|
import { isEmptyValue, displayText, ratingMax, findPerson, findOption, statusTone, editText, textMax, sheetLabels, normalizeValue, sameValue, spokenText, drawnColumns, fitSamples, fittedWidth, columnWidth, SHEET_COLUMN_BOUNDS, sortRows, SHEET_ROW_HEIGHT, cellKey, columnOffsets, SHEET_ROW_NUMBER_WIDTH, rangeOf, presenceByCell, presenceByRow, presenceByColumn, scrollToRow, planClear, visibleRows, cellDescription, nextSort, rowName, inRange, hasPrevious, flagText, toTSV, planPaste, parseTSV, isMod, moveFrom, isTypingKey, editorSide, optionHue, parseText, liveOptions, checkValue } from './chunk-LFSIKGRQ.js';
|
|
7
7
|
import { presenceLabels } from './chunk-Z7JYG5TF.js';
|
|
8
8
|
import { Popover } from './chunk-KHJIEPZV.js';
|
|
9
|
-
import { Avatar } from './chunk-PZKHBB7D.js';
|
|
10
9
|
import { StatusDot } from './chunk-WIATRXEJ.js';
|
|
11
10
|
import { Tooltip } from './chunk-I33UIUZD.js';
|
|
11
|
+
import { Avatar } from './chunk-PZKHBB7D.js';
|
|
12
12
|
import { Menu } from './chunk-PCI7ZJ6Z.js';
|
|
13
13
|
import { isComposing } from './chunk-H5XTJ7GJ.js';
|
|
14
14
|
import { Button } from './chunk-OG6CL3EB.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Avatar } from './chunk-PZKHBB7D.js';
|
|
2
1
|
import { useRoving, tabStop } from './chunk-EGMQURBR.js';
|
|
2
|
+
import { Avatar } from './chunk-PZKHBB7D.js';
|
|
3
3
|
import { cx } from './chunk-ODEQTPFM.js';
|
|
4
4
|
import { CREWLET_CHARACTERS, CREWLET_CHARACTER_GEOMETRY } from '@crewlethq/icons/characters';
|
|
5
5
|
import { jsx } from 'react/jsx-runtime';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Tag } from './chunk-KYIAFNU7.js';
|
|
2
2
|
import { useListbox } from './chunk-7KHM2FZH.js';
|
|
3
|
+
import { announce } from './chunk-RSAQOKH3.js';
|
|
3
4
|
import { isComposing } from './chunk-H5XTJ7GJ.js';
|
|
4
5
|
import { IconButton } from './chunk-LACA4JGC.js';
|
|
5
6
|
import { useFocusModality } from './chunk-NUZHC6MM.js';
|
|
6
|
-
import { announce } from './chunk-RSAQOKH3.js';
|
|
7
7
|
import { cx } from './chunk-ODEQTPFM.js';
|
|
8
8
|
import './TagsInput-CLFHP6I2.css';
|
|
9
9
|
import { forwardRef, useState, useRef, useId, useImperativeHandle, useEffect, useMemo, useLayoutEffect } from 'react';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IconButton } from './chunk-LACA4JGC.js';
|
|
2
1
|
import { announce } from './chunk-RSAQOKH3.js';
|
|
2
|
+
import { IconButton } from './chunk-LACA4JGC.js';
|
|
3
3
|
import { cx } from './chunk-ODEQTPFM.js';
|
|
4
4
|
import './ArrangeFrame-QXOQTFAH.css';
|
|
5
5
|
import { forwardRef, useRef, useCallback, useState, useEffect } from 'react';
|