arxatec-ui 0.1.71 → 0.1.72
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 +277 -9
- package/dist/arxatec-ui.css +1 -1
- package/dist/components/autosave_field_status/index.d.ts +5 -0
- package/dist/components/autosave_field_status/index.js +12 -0
- package/dist/components/autosave_field_status/index.js.map +1 -0
- package/dist/components/autosave_status/constants/index.d.ts +1 -0
- package/dist/components/autosave_status/constants/index.js +6 -0
- package/dist/components/autosave_status/constants/index.js.map +1 -0
- package/dist/components/autosave_status/index.d.ts +9 -0
- package/dist/components/autosave_status/index.js +46 -0
- package/dist/components/autosave_status/index.js.map +1 -0
- package/dist/components/autosave_status/types/index.d.ts +2 -0
- package/dist/components/editable_fields/context/index.d.ts +31 -0
- package/dist/components/editable_fields/context/index.js +30 -0
- package/dist/components/editable_fields/context/index.js.map +1 -0
- package/dist/components/editable_fields/hooks/index.d.ts +1 -0
- package/dist/components/editable_fields/hooks/index.js +8 -0
- package/dist/components/editable_fields/hooks/index.js.map +1 -0
- package/dist/components/editable_fields/index.d.ts +3 -0
- package/dist/components/editable_fields/index.js +32 -0
- package/dist/components/editable_fields/index.js.map +1 -0
- package/dist/components/emoji_picker/components/emoji_picker_content/index.d.ts +3 -1
- package/dist/components/emoji_picker/components/emoji_picker_content/index.js +3 -3
- package/dist/components/emoji_picker/components/emoji_picker_content/index.js.map +1 -1
- package/dist/components/emoji_picker/components/emoji_picker_footer/index.d.ts +3 -1
- package/dist/components/emoji_picker/components/emoji_picker_footer/index.js +3 -3
- package/dist/components/emoji_picker/components/emoji_picker_footer/index.js.map +1 -1
- package/dist/components/file_explorer/constants/index.d.ts +1 -0
- package/dist/components/file_explorer/constants/index.js +6 -0
- package/dist/components/file_explorer/constants/index.js.map +1 -0
- package/dist/components/file_explorer/explorer_breadcrumb/index.d.ts +9 -0
- package/dist/components/file_explorer/explorer_breadcrumb/index.js +21 -0
- package/dist/components/file_explorer/explorer_breadcrumb/index.js.map +1 -0
- package/dist/components/file_explorer/explorer_empty_state/index.d.ts +9 -0
- package/dist/components/file_explorer/explorer_empty_state/index.js +32 -0
- package/dist/components/file_explorer/explorer_empty_state/index.js.map +1 -0
- package/dist/components/file_explorer/explorer_error_state/index.d.ts +6 -0
- package/dist/components/file_explorer/explorer_error_state/index.js +18 -0
- package/dist/components/file_explorer/explorer_error_state/index.js.map +1 -0
- package/dist/components/file_explorer/explorer_grid/index.d.ts +10 -0
- package/dist/components/file_explorer/explorer_grid/index.js +21 -0
- package/dist/components/file_explorer/explorer_grid/index.js.map +1 -0
- package/dist/components/file_explorer/explorer_grid_card/index.d.ts +25 -0
- package/dist/components/file_explorer/explorer_grid_card/index.js +79 -0
- package/dist/components/file_explorer/explorer_grid_card/index.js.map +1 -0
- package/dist/components/file_explorer/explorer_loading_state/index.d.ts +4 -0
- package/dist/components/file_explorer/explorer_loading_state/index.js +9 -0
- package/dist/components/file_explorer/explorer_loading_state/index.js.map +1 -0
- package/dist/components/file_explorer/explorer_name_cell/index.d.ts +12 -0
- package/dist/components/file_explorer/explorer_name_cell/index.js +32 -0
- package/dist/components/file_explorer/explorer_name_cell/index.js.map +1 -0
- package/dist/components/file_explorer/explorer_panel/index.d.ts +11 -0
- package/dist/components/file_explorer/explorer_panel/index.js +17 -0
- package/dist/components/file_explorer/explorer_panel/index.js.map +1 -0
- package/dist/components/file_explorer/explorer_row/index.d.ts +18 -0
- package/dist/components/file_explorer/explorer_row/index.js +39 -0
- package/dist/components/file_explorer/explorer_row/index.js.map +1 -0
- package/dist/components/file_explorer/explorer_table/index.d.ts +20 -0
- package/dist/components/file_explorer/explorer_table/index.js +63 -0
- package/dist/components/file_explorer/explorer_table/index.js.map +1 -0
- package/dist/components/file_explorer/index.d.ts +26 -0
- package/dist/components/file_explorer/item_actions/index.d.ts +3 -0
- package/dist/components/file_explorer/item_actions/item_actions_context_content/index.d.ts +5 -0
- package/dist/components/file_explorer/item_actions/item_actions_context_content/index.js +21 -0
- package/dist/components/file_explorer/item_actions/item_actions_context_content/index.js.map +1 -0
- package/dist/components/file_explorer/item_actions/item_actions_dropdown/index.d.ts +7 -0
- package/dist/components/file_explorer/item_actions/item_actions_dropdown/index.js +38 -0
- package/dist/components/file_explorer/item_actions/item_actions_dropdown/index.js.map +1 -0
- package/dist/components/file_explorer/item_actions/types/index.d.ts +9 -0
- package/dist/components/file_explorer/item_actions/utils/index.d.ts +2 -0
- package/dist/components/file_explorer/item_actions/utils/index.js +6 -0
- package/dist/components/file_explorer/item_actions/utils/index.js.map +1 -0
- package/dist/components/file_explorer/shared/utils/index.d.ts +2 -0
- package/dist/components/file_explorer/shared/utils/index.js +8 -0
- package/dist/components/file_explorer/shared/utils/index.js.map +1 -0
- package/dist/components/file_explorer/types/index.d.ts +1 -0
- package/dist/components/file_thumbnail/index.d.ts +12 -0
- package/dist/components/file_thumbnail/index.js +35 -0
- package/dist/components/file_thumbnail/index.js.map +1 -0
- package/dist/components/file_type_icon/file_kind/index.d.ts +13 -0
- package/dist/components/file_type_icon/file_kind/index.js +178 -0
- package/dist/components/file_type_icon/file_kind/index.js.map +1 -0
- package/dist/components/file_type_icon/file_kind/mime_extensions.d.ts +2 -0
- package/dist/components/file_type_icon/file_kind/mime_extensions.js +54 -0
- package/dist/components/file_type_icon/file_kind/mime_extensions.js.map +1 -0
- package/dist/components/file_type_icon/file_type_icon.d.ts +6 -0
- package/dist/components/file_type_icon/file_type_icon.js +67 -0
- package/dist/components/file_type_icon/file_type_icon.js.map +1 -0
- package/dist/components/file_type_icon/index.d.ts +4 -0
- package/dist/components/folder_icon/constants/index.d.ts +11 -0
- package/dist/components/folder_icon/constants/index.js +41 -0
- package/dist/components/folder_icon/constants/index.js.map +1 -0
- package/dist/components/folder_icon/index.d.ts +8 -0
- package/dist/components/folder_icon/index.js +31 -0
- package/dist/components/folder_icon/index.js.map +1 -0
- package/dist/components/hex_color_picker/hex_color_picker_content/index.d.ts +12 -0
- package/dist/components/hex_color_picker/hex_color_picker_content/index.js +42 -0
- package/dist/components/hex_color_picker/hex_color_picker_content/index.js.map +1 -0
- package/dist/components/hex_color_picker/hex_color_picker_popover/index.d.ts +11 -0
- package/dist/components/hex_color_picker/hex_color_picker_popover/index.js +35 -0
- package/dist/components/hex_color_picker/hex_color_picker_popover/index.js.map +1 -0
- package/dist/components/hex_color_picker/index.d.ts +2 -0
- package/dist/components/hex_color_picker/utils/index.d.ts +3 -0
- package/dist/components/hex_color_picker/utils/index.js +35 -0
- package/dist/components/hex_color_picker/utils/index.js.map +1 -0
- package/dist/components/icon_emoji_picker/icon_emoji/index.d.ts +5 -0
- package/dist/components/icon_emoji_picker/icon_emoji/index.js +19 -0
- package/dist/components/icon_emoji_picker/icon_emoji/index.js.map +1 -0
- package/dist/components/icon_emoji_picker/icon_emoji_picker/index.d.ts +23 -0
- package/dist/components/icon_emoji_picker/icon_emoji_picker/index.js +91 -0
- package/dist/components/icon_emoji_picker/icon_emoji_picker/index.js.map +1 -0
- package/dist/components/icon_emoji_picker/icon_grid/constants/index.d.ts +3 -0
- package/dist/components/icon_emoji_picker/icon_grid/constants/index.js +6 -0
- package/dist/components/icon_emoji_picker/icon_grid/constants/index.js.map +1 -0
- package/dist/components/icon_emoji_picker/icon_grid/hooks/index.d.ts +1 -0
- package/dist/components/icon_emoji_picker/icon_grid/hooks/use_icon_pagination/index.d.ts +7 -0
- package/dist/components/icon_emoji_picker/icon_grid/hooks/use_icon_pagination/index.js +35 -0
- package/dist/components/icon_emoji_picker/icon_grid/hooks/use_icon_pagination/index.js.map +1 -0
- package/dist/components/icon_emoji_picker/icon_grid/index.d.ts +8 -0
- package/dist/components/icon_emoji_picker/icon_grid/index.js +49 -0
- package/dist/components/icon_emoji_picker/icon_grid/index.js.map +1 -0
- package/dist/components/icon_emoji_picker/index.d.ts +3 -0
- package/dist/components/icon_emoji_picker/utils/index.d.ts +1 -0
- package/dist/components/icon_emoji_picker/utils/index.js +6 -0
- package/dist/components/icon_emoji_picker/utils/index.js.map +1 -0
- package/dist/components/icons/components/google_calendar_isotype/index.d.ts +2 -0
- package/dist/components/icons/components/google_calendar_isotype/index.js +414 -0
- package/dist/components/icons/components/google_calendar_isotype/index.js.map +1 -0
- package/dist/components/icons/components/google_drive_isotype/index.d.ts +2 -0
- package/dist/components/icons/components/google_drive_isotype/index.js +103 -0
- package/dist/components/icons/components/google_drive_isotype/index.js.map +1 -0
- package/dist/components/icons/components/index.d.ts +4 -0
- package/dist/components/icons/components/onedrive_isotype/index.d.ts +2 -0
- package/dist/components/icons/components/onedrive_isotype/index.js +246 -0
- package/dist/components/icons/components/onedrive_isotype/index.js.map +1 -0
- package/dist/components/icons/components/outlook_calendar_isotype/index.d.ts +2 -0
- package/dist/components/icons/components/outlook_calendar_isotype/index.js +378 -0
- package/dist/components/icons/components/outlook_calendar_isotype/index.js.map +1 -0
- package/dist/components/inline_date_field/index.d.ts +11 -0
- package/dist/components/inline_date_field/index.js +52 -0
- package/dist/components/inline_date_field/index.js.map +1 -0
- package/dist/components/inline_duration_field/components/duration_column/index.d.ts +8 -0
- package/dist/components/inline_duration_field/components/duration_column/index.js +47 -0
- package/dist/components/inline_duration_field/components/duration_column/index.js.map +1 -0
- package/dist/components/inline_duration_field/constants/index.d.ts +4 -0
- package/dist/components/inline_duration_field/constants/index.js +12 -0
- package/dist/components/inline_duration_field/constants/index.js.map +1 -0
- package/dist/components/inline_duration_field/index.d.ts +9 -0
- package/dist/components/inline_duration_field/index.js +89 -0
- package/dist/components/inline_duration_field/index.js.map +1 -0
- package/dist/components/inline_duration_field/utils/index.d.ts +11 -0
- package/dist/components/inline_duration_field/utils/index.js +21 -0
- package/dist/components/inline_duration_field/utils/index.js.map +1 -0
- package/dist/components/inline_editable_text/constants/index.d.ts +2 -0
- package/dist/components/inline_editable_text/constants/index.js +7 -0
- package/dist/components/inline_editable_text/constants/index.js.map +1 -0
- package/dist/components/inline_editable_text/index.d.ts +16 -0
- package/dist/components/inline_editable_text/index.js +109 -0
- package/dist/components/inline_editable_text/index.js.map +1 -0
- package/dist/components/inline_field_trigger/index.d.ts +3 -0
- package/dist/components/inline_field_trigger/index.js +16 -0
- package/dist/components/inline_field_trigger/index.js.map +1 -0
- package/dist/components/inline_markdown_field/index.d.ts +14 -0
- package/dist/components/inline_markdown_field/index.js +70 -0
- package/dist/components/inline_markdown_field/index.js.map +1 -0
- package/dist/components/inline_option_field/index.d.ts +19 -0
- package/dist/components/inline_option_field/index.js +56 -0
- package/dist/components/inline_option_field/index.js.map +1 -0
- package/dist/components/offline_banner/index.d.ts +12 -0
- package/dist/components/offline_banner/index.js +76 -0
- package/dist/components/offline_banner/index.js.map +1 -0
- package/dist/components/property_row/index.d.ts +10 -0
- package/dist/components/property_row/index.js +46 -0
- package/dist/components/property_row/index.js.map +1 -0
- package/dist/components/select_table_header/index.d.ts +13 -0
- package/dist/components/select_table_header/index.js +17 -0
- package/dist/components/select_table_header/index.js.map +1 -0
- package/dist/components/shiny_text/index.d.ts +7 -0
- package/dist/components/shiny_text/index.js +22 -0
- package/dist/components/shiny_text/index.js.map +1 -0
- package/dist/components/table_date_field/index.d.ts +8 -0
- package/dist/components/table_date_field/index.js +67 -0
- package/dist/components/table_date_field/index.js.map +1 -0
- package/dist/components/table_option_field/index.d.ts +13 -0
- package/dist/components/table_option_field/index.js +73 -0
- package/dist/components/table_option_field/index.js.map +1 -0
- package/dist/editable-fields.js +19 -0
- package/dist/exports/editable-fields.d.ts +19 -0
- package/dist/exports/icon-emoji-picker.d.ts +1 -0
- package/dist/exports/offline-banner.d.ts +1 -0
- package/dist/exports/provider-icons.d.ts +4 -0
- package/dist/exports/shiny-text.d.ts +1 -0
- package/dist/icon-emoji-picker.js +4 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +85 -40
- package/dist/offline-banner.js +2 -0
- package/dist/provider-icons.js +5 -0
- package/dist/shiny-text.js +2 -0
- package/dist/styles.css +40 -1
- package/dist/utilities/colors/index.d.ts +1 -0
- package/dist/utilities/colors/index.js +9 -0
- package/dist/utilities/colors/index.js.map +1 -0
- package/package.json +32 -3
package/README.md
CHANGED
|
@@ -87,6 +87,11 @@ Patterns follow **shadcn**-style APIs (compound components with named exports).
|
|
|
87
87
|
|
|
88
88
|
## Package exports
|
|
89
89
|
|
|
90
|
+
Import general components, hooks, prop types and utilities with named imports
|
|
91
|
+
from `arxatec-ui`. The grouped component entries are optional. The library
|
|
92
|
+
preserves modules and declares side effects so compatible bundlers can discard
|
|
93
|
+
unused exports in production builds.
|
|
94
|
+
|
|
90
95
|
### Components (overview)
|
|
91
96
|
|
|
92
97
|
- **Forms & text:** `Button`, `Input`, `Textarea`, `Label`, `Checkbox`, `RadioGroup`, `Select`, `Slider`, `Toggle`, `InputOTP`, `FileDropZone`, `LocationInput`, `DateRangePicker`, `Calendar`, `AsyncSelect`, `DescriptionMarkdownEditor`, `RichTextEditor`, and more.
|
|
@@ -119,6 +124,256 @@ import { AppleIsotype } from "arxatec-ui";
|
|
|
119
124
|
|
|
120
125
|
The full list matches the `export *` entries in [`src/index.ts`](./src/index.ts).
|
|
121
126
|
|
|
127
|
+
### Editable fields (0.1.72)
|
|
128
|
+
|
|
129
|
+
Import property rows, inline editing, table cells, color selection and save
|
|
130
|
+
feedback from `arxatec-ui`. The optional `/editable-fields` entry groups the same
|
|
131
|
+
APIs. These components receive values and callbacks; the application owns
|
|
132
|
+
validation, persistence and retry logic.
|
|
133
|
+
|
|
134
|
+
| Component | Source |
|
|
135
|
+
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
136
|
+
| `PropertyRow` | [`src/components/property_row/index.tsx`](./src/components/property_row/index.tsx) |
|
|
137
|
+
| `InlineEditableText` | [`src/components/inline_editable_text/index.tsx`](./src/components/inline_editable_text/index.tsx) |
|
|
138
|
+
| `InlineOptionField` | [`src/components/inline_option_field/index.tsx`](./src/components/inline_option_field/index.tsx) |
|
|
139
|
+
| `InlineDateField` | [`src/components/inline_date_field/index.tsx`](./src/components/inline_date_field/index.tsx) |
|
|
140
|
+
| `InlineMarkdownField` | [`src/components/inline_markdown_field/index.tsx`](./src/components/inline_markdown_field/index.tsx) |
|
|
141
|
+
| `InlineDurationField` | [`src/components/inline_duration_field/index.tsx`](./src/components/inline_duration_field/index.tsx) |
|
|
142
|
+
| `TableDateField` | [`src/components/table_date_field/index.tsx`](./src/components/table_date_field/index.tsx) |
|
|
143
|
+
| `TableOptionField` | [`src/components/table_option_field/index.tsx`](./src/components/table_option_field/index.tsx) |
|
|
144
|
+
| `AutosaveStatus` | [`src/components/autosave_status/index.tsx`](./src/components/autosave_status/index.tsx) |
|
|
145
|
+
| `AutosaveFieldStatus` | [`src/components/autosave_field_status/index.tsx`](./src/components/autosave_field_status/index.tsx) |
|
|
146
|
+
| `SelectTableHeader` | [`src/components/select_table_header/index.tsx`](./src/components/select_table_header/index.tsx) |
|
|
147
|
+
| `HexColorPickerContent` | [`src/components/hex_color_picker/hex_color_picker_content/index.tsx`](./src/components/hex_color_picker/hex_color_picker_content/index.tsx) |
|
|
148
|
+
| `HexColorPickerPopover` | [`src/components/hex_color_picker/hex_color_picker_popover/index.tsx`](./src/components/hex_color_picker/hex_color_picker_popover/index.tsx) |
|
|
149
|
+
|
|
150
|
+
Configure shared copy, date-fns locale, date formats and swatches with
|
|
151
|
+
`EditableFieldsProvider`. A partial configuration inherits the nearest provider;
|
|
152
|
+
the default copy and date locale are Spanish. Supply all shared labels when
|
|
153
|
+
switching the whole interface to another language. Field-specific labels such as
|
|
154
|
+
`ariaLabel`, `emptyText` and `clearLabel` remain component props.
|
|
155
|
+
|
|
156
|
+
```tsx
|
|
157
|
+
import { useState } from "react";
|
|
158
|
+
import { enUS } from "date-fns/locale";
|
|
159
|
+
import { FileText } from "lucide-react";
|
|
160
|
+
import {
|
|
161
|
+
EditableFieldsProvider,
|
|
162
|
+
InlineEditableText,
|
|
163
|
+
PropertyRow,
|
|
164
|
+
} from "arxatec-ui";
|
|
165
|
+
|
|
166
|
+
export function DocumentName() {
|
|
167
|
+
const [name, setName] = useState("Shared document");
|
|
168
|
+
return (
|
|
169
|
+
<EditableFieldsProvider
|
|
170
|
+
locale={enUS}
|
|
171
|
+
dateFormat="MMMM d, yyyy"
|
|
172
|
+
tableDateFormat="MMM d, yyyy"
|
|
173
|
+
labels={{
|
|
174
|
+
empty: "Add…",
|
|
175
|
+
hint: "Enter to save · Esc to cancel",
|
|
176
|
+
hours: "Hours",
|
|
177
|
+
minutes: "Minutes",
|
|
178
|
+
saving: "Saving…",
|
|
179
|
+
saved: "Saved",
|
|
180
|
+
savedAgo: "Saved a moment ago",
|
|
181
|
+
offline: "Offline · changes will save when connected",
|
|
182
|
+
genericError: "Could not save. Check your connection.",
|
|
183
|
+
retry: "Retry",
|
|
184
|
+
acceptColor: "Accept",
|
|
185
|
+
clearColor: "Clear color",
|
|
186
|
+
selectColor: "Select color",
|
|
187
|
+
changeColor: "Change color",
|
|
188
|
+
currentColor: "current",
|
|
189
|
+
}}
|
|
190
|
+
>
|
|
191
|
+
<PropertyRow icon={FileText} label="Name">
|
|
192
|
+
<InlineEditableText
|
|
193
|
+
value={name}
|
|
194
|
+
onCommit={setName}
|
|
195
|
+
ariaLabel="Document name"
|
|
196
|
+
/>
|
|
197
|
+
</PropertyRow>
|
|
198
|
+
</EditableFieldsProvider>
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
`InlineEditableText` commits on Enter or blur, cancels with Escape and accepts a
|
|
204
|
+
`validate` callback. Multiline text commits with Ctrl/⌘ + Enter.
|
|
205
|
+
`InlineDurationField` receives seconds; `InlineDateField` receives `Date` values;
|
|
206
|
+
`TableDateField` receives and emits ISO strings or `null`. Table fields preserve
|
|
207
|
+
focus and stop click/key events inside their popovers from activating their row.
|
|
208
|
+
|
|
209
|
+
`InlineFieldTrigger` supplies the shared button style for application-specific
|
|
210
|
+
selectors and forwards its ref. `useEditableFields`, configuration and component
|
|
211
|
+
prop types, `AutosaveFieldState`, `AutosaveStatusValue`, `normalizeHexColor`,
|
|
212
|
+
`hexColorOrFallback`, `HEX_COLOR_SWATCHES` and `HEX_COLOR_PICKER_FALLBACK` are also
|
|
213
|
+
exported from `arxatec-ui` and the optional `/editable-fields` entry.
|
|
214
|
+
|
|
215
|
+
### Provider icons (0.1.72)
|
|
216
|
+
|
|
217
|
+
Import the multicolor integration SVGs from `arxatec-ui`. The optional
|
|
218
|
+
`/provider-icons` entry exposes the same components:
|
|
219
|
+
|
|
220
|
+
| Component | Source |
|
|
221
|
+
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
222
|
+
| `GoogleCalendarIsotype` | [`src/components/icons/components/google_calendar_isotype/index.tsx`](./src/components/icons/components/google_calendar_isotype/index.tsx) |
|
|
223
|
+
| `GoogleDriveIsotype` | [`src/components/icons/components/google_drive_isotype/index.tsx`](./src/components/icons/components/google_drive_isotype/index.tsx) |
|
|
224
|
+
| `OneDriveIsotype` | [`src/components/icons/components/onedrive_isotype/index.tsx`](./src/components/icons/components/onedrive_isotype/index.tsx) |
|
|
225
|
+
| `OutlookCalendarIsotype` | [`src/components/icons/components/outlook_calendar_isotype/index.tsx`](./src/components/icons/components/outlook_calendar_isotype/index.tsx) |
|
|
226
|
+
|
|
227
|
+
```tsx
|
|
228
|
+
import { GoogleDriveIsotype } from "arxatec-ui";
|
|
229
|
+
|
|
230
|
+
<GoogleDriveIsotype className="size-5" aria-hidden="true" />;
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
The icons accept standard SVG props and namespace their internal definitions per
|
|
234
|
+
instance. The existing `GoogleDriveIcon` and `OneDriveIcon` keep their outline
|
|
235
|
+
appearance.
|
|
236
|
+
|
|
237
|
+
### Animated text, connectivity and icon/emoji selection (0.1.72)
|
|
238
|
+
|
|
239
|
+
Use named imports from `arxatec-ui` for these components. Individual entries are
|
|
240
|
+
also available as optional APIs:
|
|
241
|
+
|
|
242
|
+
| Optional entry | Components | Source |
|
|
243
|
+
| ------------------------------ | --------------------------------------------- | ------------------------------------------------------------------------------------------ |
|
|
244
|
+
| `arxatec-ui/shiny-text` | `ShinyText` | [`src/components/shiny_text/index.tsx`](./src/components/shiny_text/index.tsx) |
|
|
245
|
+
| `arxatec-ui/offline-banner` | `OfflineBanner` | [`src/components/offline_banner/index.tsx`](./src/components/offline_banner/index.tsx) |
|
|
246
|
+
| `arxatec-ui/icon-emoji-picker` | `IconEmoji`, `IconEmojiPicker`, `isEmojiIcon` | [`src/components/icon_emoji_picker/index.ts`](./src/components/icon_emoji_picker/index.ts) |
|
|
247
|
+
|
|
248
|
+
`ShinyText` accepts children, `className` for its wrapper and `textClassName` for
|
|
249
|
+
its visible text. Its animated overlay is hidden from assistive technology.
|
|
250
|
+
The animation CSS is included in the existing `arxatec-ui/styles.css` import.
|
|
251
|
+
|
|
252
|
+
```tsx
|
|
253
|
+
import { OfflineBanner, ShinyText } from "arxatec-ui";
|
|
254
|
+
|
|
255
|
+
<ShinyText>Preparing response…</ShinyText>;
|
|
256
|
+
<OfflineBanner
|
|
257
|
+
isOnline={isOnline}
|
|
258
|
+
labels={{
|
|
259
|
+
offline: "You have no internet connection",
|
|
260
|
+
reconnected: "You're back online",
|
|
261
|
+
close: "Close",
|
|
262
|
+
}}
|
|
263
|
+
/>;
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
`OfflineBanner` receives connectivity from the application. It renders offline
|
|
267
|
+
feedback with a dismiss button, then shows a reconnect message for three seconds
|
|
268
|
+
after an offline-to-online transition. `reconnectedDurationMs` adjusts that time.
|
|
269
|
+
Translated copy and `className` are optional; defaults preserve the Spanish UI.
|
|
270
|
+
|
|
271
|
+
`IconEmoji` renders either a Lucide name or an emoji glyph, with `folder` as the
|
|
272
|
+
empty-value fallback. `IconEmojiPicker` is a controlled picker with a custom
|
|
273
|
+
trigger, icon/emoji tabs, searchable icon pagination and `onValueChange`:
|
|
274
|
+
|
|
275
|
+
```tsx
|
|
276
|
+
import { IconEmoji, IconEmojiPicker } from "arxatec-ui";
|
|
277
|
+
|
|
278
|
+
<IconEmojiPicker
|
|
279
|
+
value={icon}
|
|
280
|
+
onValueChange={setIcon}
|
|
281
|
+
locale="en"
|
|
282
|
+
labels={{
|
|
283
|
+
icons: "Icons",
|
|
284
|
+
emojis: "Emojis",
|
|
285
|
+
searchIcons: "Search an icon…",
|
|
286
|
+
searchEmojis: "Search an emoji…",
|
|
287
|
+
emptyIcons: "No icon found.",
|
|
288
|
+
emptyEmojis: "No emoji found.",
|
|
289
|
+
emojiHint: "Select an emoji…",
|
|
290
|
+
}}
|
|
291
|
+
>
|
|
292
|
+
<button type="button" aria-label="Choose icon or emoji">
|
|
293
|
+
<IconEmoji value={icon} className="size-5" />
|
|
294
|
+
</button>
|
|
295
|
+
</IconEmojiPicker>;
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
It also accepts `align`, `modal` and `disabled`. Copy and emoji-data locale default
|
|
299
|
+
to Spanish and can be configured independently. Prop, label and locale types are
|
|
300
|
+
exported with the components. The panel width follows text size to accommodate
|
|
301
|
+
its twelve columns, padding, scrollbar and borders. Existing `EmojiPickerContent` and
|
|
302
|
+
`EmojiPickerFooter` now accept `emptyLabel` to translate their empty state and
|
|
303
|
+
selection hint while keeping their previous defaults.
|
|
304
|
+
The emoji viewport's scrollbar styling is included in `arxatec-ui/styles.css`,
|
|
305
|
+
alongside the animated-text and connectivity-banner styles.
|
|
306
|
+
|
|
307
|
+
### Files, folders and explorer presentation (0.1.72)
|
|
308
|
+
|
|
309
|
+
Import these components by name from `arxatec-ui`:
|
|
310
|
+
|
|
311
|
+
```tsx
|
|
312
|
+
import {
|
|
313
|
+
FileTypeIcon,
|
|
314
|
+
FolderIcon,
|
|
315
|
+
FileThumbnail,
|
|
316
|
+
ExplorerGridCard,
|
|
317
|
+
} from "arxatec-ui";
|
|
318
|
+
|
|
319
|
+
<FileTypeIcon
|
|
320
|
+
mimeType="application/pdf"
|
|
321
|
+
fileName="Report.pdf"
|
|
322
|
+
className="size-6"
|
|
323
|
+
/>;
|
|
324
|
+
<FolderIcon variant="shared" className="size-6" />;
|
|
325
|
+
<FileThumbnail
|
|
326
|
+
source={thumbnailUrl}
|
|
327
|
+
isLoading={isLoading}
|
|
328
|
+
isError={isError}
|
|
329
|
+
fallback={<FileTypeIcon mimeType="application/pdf" className="size-14" />}
|
|
330
|
+
/>;
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
`FileTypeIcon` is the file-shaped SVG previously named `IconType` in Lawyer
|
|
334
|
+
Platform. Its color follows the MIME family; its visible label prefers the
|
|
335
|
+
filename extension, then the MIME extension, then a family label such as `FILE`.
|
|
336
|
+
Labels are uppercase and limited to four characters. It covers PDF, office
|
|
337
|
+
documents, images, video, audio, archives, code, JSON, XML, fonts, databases,
|
|
338
|
+
binary files and native Google Workspace formats. Both it and `FolderIcon`
|
|
339
|
+
accept standard SVG props and are decorative by default. Pass accessible SVG
|
|
340
|
+
props when using an icon without adjacent text.
|
|
341
|
+
|
|
342
|
+
`FolderIcon` accepts `default`, `shared` and `drive` variants. `FOLDER_VARIANT`,
|
|
343
|
+
`FolderVariant`, `getFileKindStyle`, `getFileTypeLabel`, `FILE_KIND_STYLES`,
|
|
344
|
+
`FileKind` and `FileKindStyle` are exported from the main package too.
|
|
345
|
+
|
|
346
|
+
| Components | Source |
|
|
347
|
+
| ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
348
|
+
| `FileTypeIcon` | [`src/components/file_type_icon/file_type_icon.tsx`](./src/components/file_type_icon/file_type_icon.tsx) |
|
|
349
|
+
| `FolderIcon` | [`src/components/folder_icon/index.tsx`](./src/components/folder_icon/index.tsx) |
|
|
350
|
+
| `FileThumbnail` | [`src/components/file_thumbnail/index.tsx`](./src/components/file_thumbnail/index.tsx) |
|
|
351
|
+
| `ExplorerGridCard`, `ExplorerRow`, `ExplorerNameCell` | [`src/components/file_explorer/index.ts`](./src/components/file_explorer/index.ts) |
|
|
352
|
+
| `ExplorerGrid`, `ExplorerTable`, `ExplorerPanel` | [`src/components/file_explorer/index.ts`](./src/components/file_explorer/index.ts) |
|
|
353
|
+
| `ExplorerBreadcrumb` | [`src/components/file_explorer/explorer_breadcrumb/index.tsx`](./src/components/file_explorer/explorer_breadcrumb/index.tsx) |
|
|
354
|
+
| `ExplorerEmptyState`, `ExplorerLoadingState`, `ExplorerErrorState` | [`src/components/file_explorer/index.ts`](./src/components/file_explorer/index.ts) |
|
|
355
|
+
| `ItemActionsDropdown`, `ItemActionsContextContent` | [`src/components/file_explorer/item_actions/index.ts`](./src/components/file_explorer/item_actions/index.ts) |
|
|
356
|
+
|
|
357
|
+
`FileThumbnail` receives a thumbnail URL, loading/error state and a fallback. It
|
|
358
|
+
forwards its container ref, displays a skeleton while loading and falls back if
|
|
359
|
+
the image fails. A new source resets the image failure state. Fetching signed
|
|
360
|
+
URLs, generating PDF previews, cloud permissions and object-URL cleanup belong
|
|
361
|
+
to the consumer. These exports do not load PDF or office viewer engines.
|
|
362
|
+
|
|
363
|
+
Explorer rows and cards receive `id`, `type` (`file` or `folder`), `selected`,
|
|
364
|
+
`actions` and their content. `ExplorerAction` supplies the action key, translated
|
|
365
|
+
label, icon and callback; hidden actions are omitted. Cards also receive `name`,
|
|
366
|
+
`icon`, `preview`, optional path/metadata and pointer or drag handlers. Pass
|
|
367
|
+
`actionsLabel` to localize the action-menu trigger. Selection, opening, moving,
|
|
368
|
+
deleting and downloading are controlled by consumer callbacks.
|
|
369
|
+
|
|
370
|
+
`ExplorerBreadcrumb` receives `{ id, name }` items and `onNavigate`; its buttons
|
|
371
|
+
support keyboard navigation. `ExplorerTable` receives `ExplorerColumn` entries
|
|
372
|
+
and accepts `flow` for content-height tables. Grid, panel and table containers
|
|
373
|
+
retain selection/viewport refs, overlay and footer slots. `className` controls
|
|
374
|
+
container height and spacing. All component prop types and `EXPLORER_GRID_CLASS`
|
|
375
|
+
are also exported from `arxatec-ui`.
|
|
376
|
+
|
|
122
377
|
### Hooks
|
|
123
378
|
|
|
124
379
|
- **`useDebounce`**
|
|
@@ -145,13 +400,25 @@ import "leaflet/dist/leaflet.css";
|
|
|
145
400
|
|
|
146
401
|
## Developing this repo
|
|
147
402
|
|
|
148
|
-
| Command
|
|
149
|
-
|
|
|
150
|
-
| `npm run dev`
|
|
151
|
-
| `npm run storybook`
|
|
152
|
-
| `npm run build:lib`
|
|
153
|
-
| `npm run build`
|
|
154
|
-
| `npm run lint`
|
|
403
|
+
| Command | Description |
|
|
404
|
+
| ---------------------- | ------------------------------ |
|
|
405
|
+
| `npm run dev` | Vite playground (style guide). |
|
|
406
|
+
| `npm run storybook` | Storybook on port 6006. |
|
|
407
|
+
| `npm run build:lib` | Build `dist/` for npm. |
|
|
408
|
+
| `npm run build` | Playground production build. |
|
|
409
|
+
| `npm run lint` | ESLint. |
|
|
410
|
+
| `pnpm test:components` | Component unit tests. |
|
|
411
|
+
|
|
412
|
+
For local development with `arxatec-lawyer-platform`, build this library first and
|
|
413
|
+
run `pnpm update arxatec-ui --ignore-scripts` in the platform. Its local migration
|
|
414
|
+
uses `file:../../arxatec-ui`, so rebuilding this repository requires refreshing the
|
|
415
|
+
consumer package. React, React Hook Form and Tiptap continue to resolve through
|
|
416
|
+
the consumer's peer dependencies.
|
|
417
|
+
|
|
418
|
+
Release status on 2026-10-12: npm reports `0.1.71`; this source prepares `0.1.72`.
|
|
419
|
+
The new entries become available from npm after publication. Before shipping the
|
|
420
|
+
platform, replace its local `file:` dependency with the published `0.1.72` range
|
|
421
|
+
and run `pnpm update arxatec-ui`.
|
|
155
422
|
|
|
156
423
|
Publishing to npm requires **2FA**; use `npm publish --otp=...` when prompted.
|
|
157
424
|
|
|
@@ -208,6 +475,7 @@ only when matching content uses them; omit fonts from PWA precache and cache
|
|
|
208
475
|
requested faces at runtime. Consumers share `react-hook-form`, `@tiptap/core` and
|
|
209
476
|
`@tiptap/react` as peers alongside React and React Query.
|
|
210
477
|
|
|
211
|
-
Publication requires owner PR merge and clean-main publish. The platform
|
|
212
|
-
minimum release age
|
|
478
|
+
Publication requires owner PR merge and clean-main publish. The platform applies
|
|
479
|
+
a seven-day minimum release age to external dependencies and explicitly exempts
|
|
480
|
+
all versions of `arxatec-ui`; validate a tarball in isolation before a registry
|
|
213
481
|
consumer update.
|
package/dist/arxatec-ui.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
._wrapper_yldl5_1{min-height:2.5rem;font-family:var(--font-sans);font-size:var(--font-size-sm);line-height:var(--font-line-height-sm)}._wrapper_yldl5_1 .ProseMirror{max-width:none;min-height:0;font-family:var(--font-sans);font-size:var(--font-size-sm);line-height:var(--font-line-height-sm);background:0 0;outline:none;margin:0;padding:.375rem .75rem}._wrapper_yldl5_1 .ProseMirror p,._wrapper_yldl5_1 .ProseMirror li,._wrapper_yldl5_1 .ProseMirror blockquote,._wrapper_yldl5_1 .ProseMirror strong,._wrapper_yldl5_1 .ProseMirror em,._wrapper_yldl5_1 .ProseMirror u{font-family:var(--font-sans);font-size:var(--font-size-sm);line-height:var(--font-line-height-sm);margin:.5rem 0}._wrapper_yldl5_1 .ProseMirror h1{font-family:var(--font-sans);font-size:var(--font-size-lg);font-weight:600;line-height:var(--font-line-height-lg);margin:.375rem 0 .25rem}._wrapper_yldl5_1 .ProseMirror h2{font-family:var(--font-sans);font-size:var(--font-size-base);font-weight:600;line-height:var(--font-line-height-base);margin:.375rem 0 .25rem}._wrapper_yldl5_1 .ProseMirror h3{font-family:var(--font-sans);font-size:var(--font-size-sm);font-weight:600;line-height:var(--font-line-height-sm);margin:.35rem 0 .2rem}._wrapper_yldl5_1 .ProseMirror h4{font-family:var(--font-sans);font-size:var(--font-size-xs);font-weight:600;line-height:var(--font-line-height-xs);margin:.3rem 0 .15rem}._wrapper_yldl5_1 .ProseMirror h5,._wrapper_yldl5_1 .ProseMirror h6{font-family:var(--font-sans);font-size:var(--font-size-xs);font-weight:600;line-height:var(--font-line-height-xs);margin:.25rem 0}._wrapper_yldl5_1 .ProseMirror p{margin:.125rem 0}._wrapper_yldl5_1 .ProseMirror ul,._wrapper_yldl5_1 .ProseMirror ol{margin:.25rem 0;padding-left:1.25rem}._wrapper_yldl5_1 .ProseMirror li{margin:0}._wrapper_yldl5_1 .ProseMirror blockquote{border-left-width:2px;margin:.25rem 0;padding-left:.75rem}._wrapper_yldl5_1 .ProseMirror code{font-family:var(--font-mono);font-size:var(--font-size-xs)}._wrapper_yldl5_1 .ProseMirror .is-description-editor-empty:before{content:attr(data-placeholder);float:left;pointer-events:none;height:0;color:var(--color-muted-foreground);font-family:var(--font-sans);font-size:var(--font-size-sm);line-height:var(--font-line-height-sm)}._shimmer_17ewq_1{opacity:var(--loader-shimmer-opacity,1);animation:2.4s ease-in-out infinite _loader-diagonal_17ewq_1;position:absolute;inset:0;-webkit-mask-image:linear-gradient(135deg,#0000 35%,#000 50%,#0000 65%);mask-image:linear-gradient(135deg,#0000 35%,#000 50%,#0000 65%);-webkit-mask-size:250% 250%;mask-size:250% 250%}@keyframes _loader-diagonal_17ewq_1{0%{-webkit-mask-position:100% 100%;mask-position:100% 100%}to{-webkit-mask-position:0 0;mask-position:0 0}}@media (prefers-reduced-motion:reduce){._shimmer_17ewq_1{animation:none}}
|
|
1
|
+
._wrapper_yldl5_1{min-height:2.5rem;font-family:var(--font-sans);font-size:var(--font-size-sm);line-height:var(--font-line-height-sm)}._wrapper_yldl5_1 .ProseMirror{max-width:none;min-height:0;font-family:var(--font-sans);font-size:var(--font-size-sm);line-height:var(--font-line-height-sm);background:0 0;outline:none;margin:0;padding:.375rem .75rem}._wrapper_yldl5_1 .ProseMirror p,._wrapper_yldl5_1 .ProseMirror li,._wrapper_yldl5_1 .ProseMirror blockquote,._wrapper_yldl5_1 .ProseMirror strong,._wrapper_yldl5_1 .ProseMirror em,._wrapper_yldl5_1 .ProseMirror u{font-family:var(--font-sans);font-size:var(--font-size-sm);line-height:var(--font-line-height-sm);margin:.5rem 0}._wrapper_yldl5_1 .ProseMirror h1{font-family:var(--font-sans);font-size:var(--font-size-lg);font-weight:600;line-height:var(--font-line-height-lg);margin:.375rem 0 .25rem}._wrapper_yldl5_1 .ProseMirror h2{font-family:var(--font-sans);font-size:var(--font-size-base);font-weight:600;line-height:var(--font-line-height-base);margin:.375rem 0 .25rem}._wrapper_yldl5_1 .ProseMirror h3{font-family:var(--font-sans);font-size:var(--font-size-sm);font-weight:600;line-height:var(--font-line-height-sm);margin:.35rem 0 .2rem}._wrapper_yldl5_1 .ProseMirror h4{font-family:var(--font-sans);font-size:var(--font-size-xs);font-weight:600;line-height:var(--font-line-height-xs);margin:.3rem 0 .15rem}._wrapper_yldl5_1 .ProseMirror h5,._wrapper_yldl5_1 .ProseMirror h6{font-family:var(--font-sans);font-size:var(--font-size-xs);font-weight:600;line-height:var(--font-line-height-xs);margin:.25rem 0}._wrapper_yldl5_1 .ProseMirror p{margin:.125rem 0}._wrapper_yldl5_1 .ProseMirror ul,._wrapper_yldl5_1 .ProseMirror ol{margin:.25rem 0;padding-left:1.25rem}._wrapper_yldl5_1 .ProseMirror li{margin:0}._wrapper_yldl5_1 .ProseMirror blockquote{border-left-width:2px;margin:.25rem 0;padding-left:.75rem}._wrapper_yldl5_1 .ProseMirror code{font-family:var(--font-mono);font-size:var(--font-size-xs)}._wrapper_yldl5_1 .ProseMirror .is-description-editor-empty:before{content:attr(data-placeholder);float:left;pointer-events:none;height:0;color:var(--color-muted-foreground);font-family:var(--font-sans);font-size:var(--font-size-sm);line-height:var(--font-line-height-sm)}._shimmer_17ewq_1{opacity:var(--loader-shimmer-opacity,1);animation:2.4s ease-in-out infinite _loader-diagonal_17ewq_1;position:absolute;inset:0;-webkit-mask-image:linear-gradient(135deg,#0000 35%,#000 50%,#0000 65%);mask-image:linear-gradient(135deg,#0000 35%,#000 50%,#0000 65%);-webkit-mask-size:250% 250%;mask-size:250% 250%}@keyframes _loader-diagonal_17ewq_1{0%{-webkit-mask-position:100% 100%;mask-position:100% 100%}to{-webkit-mask-position:0 0;mask-position:0 0}}@media (prefers-reduced-motion:reduce){._shimmer_17ewq_1{animation:none}}.arxatec-offline-banner[data-state=open]{animation:.3s ease-out arxatec-offline-banner-enter}@keyframes arxatec-offline-banner-enter{0%{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}.shiny-text-overlay{background-size:200% 100%;background-image:linear-gradient(120deg, transparent 40%, color-mix(in oklch, var(--color-foreground) 80%, transparent) 50%, transparent 60%);-webkit-text-fill-color:transparent;color:#0000;-webkit-background-clip:text;background-clip:text;animation:3s linear infinite shiny-text-shine}@keyframes shiny-text-shine{0%{background-position:100%}to{background-position:-100%}}
|
|
2
2
|
/*$vite$:1*/
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Fragment as e, jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
2
|
+
import { AlertCircle as r, Check as i, Loader2 as a } from "lucide-react";
|
|
3
|
+
//#region src/components/autosave_field_status/index.tsx
|
|
4
|
+
var o = ({ state: o }) => /* @__PURE__ */ n(e, { children: [
|
|
5
|
+
o === "saving" ? /* @__PURE__ */ t(a, { className: "size-3.5 animate-spin" }) : null,
|
|
6
|
+
o === "saved" ? /* @__PURE__ */ t(i, { className: "size-3.5" }) : null,
|
|
7
|
+
o === "error" ? /* @__PURE__ */ t(r, { className: "size-3.5 text-destructive" }) : null
|
|
8
|
+
] });
|
|
9
|
+
//#endregion
|
|
10
|
+
export { o as AutosaveFieldStatus };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/autosave_field_status/index.tsx"],"sourcesContent":["import { AlertCircle, Check, Loader2 } from \"lucide-react\";\nimport type { AutosaveFieldState } from \"../autosave_status/types\";\n\nexport interface AutosaveFieldStatusProps {\n state?: AutosaveFieldState;\n}\n\nexport const AutosaveFieldStatus = ({ state }: AutosaveFieldStatusProps) => (\n <>\n {state === \"saving\" ? <Loader2 className=\"size-3.5 animate-spin\" /> : null}\n {state === \"saved\" ? <Check className=\"size-3.5\" /> : null}\n {state === \"error\" ? (\n <AlertCircle className=\"size-3.5 text-destructive\" />\n ) : null}\n </>\n);\n"],"mappings":";;;AAOA,IAAa,KAAuB,EAAE,eACpC,kBAAA,GAAA,EAAA,UAAA;CACG,MAAU,WAAW,kBAAC,GAAD,EAAS,WAAU,yBAA0B,CAAA,GAAG;CACrE,MAAU,UAAU,kBAAC,GAAD,EAAO,WAAU,YAAa,CAAA,GAAG;CACrD,MAAU,UACT,kBAAC,GAAD,EAAa,WAAU,6BAA8B,CAAA,GACnD;CACH,EAAA,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const SAVED_LINGER_MS = 4000;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/autosave_status/constants/index.ts"],"sourcesContent":["export const SAVED_LINGER_MS = 4000;\n"],"mappings":";AAAA,IAAa,IAAkB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AutosaveStatusValue } from './types';
|
|
2
|
+
export interface AutosaveStatusProps {
|
|
3
|
+
status: AutosaveStatusValue;
|
|
4
|
+
errorMessage: string | null;
|
|
5
|
+
isRetryable: boolean;
|
|
6
|
+
onRetry: () => void;
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const AutosaveStatus: ({ status, errorMessage, isRetryable, onRetry, className, }: AutosaveStatusProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { cn as e } from "../../utilities/class/index.js";
|
|
2
|
+
import { Button as t } from "../button/index.js";
|
|
3
|
+
import { useEditableFields as n } from "../editable_fields/hooks/index.js";
|
|
4
|
+
import { SAVED_LINGER_MS as r } from "./constants/index.js";
|
|
5
|
+
import { useEffect as i, useState as a } from "react";
|
|
6
|
+
import { Fragment as o, jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
7
|
+
import { AlertCircle as l, Check as u, CloudOff as d, Loader2 as f } from "lucide-react";
|
|
8
|
+
//#region src/components/autosave_status/index.tsx
|
|
9
|
+
var p = () => {
|
|
10
|
+
let { labels: e } = n(), [t, c] = a(!1);
|
|
11
|
+
return i(() => {
|
|
12
|
+
let e = setTimeout(() => c(!0), r);
|
|
13
|
+
return () => clearTimeout(e);
|
|
14
|
+
}, []), /* @__PURE__ */ s(o, { children: t ? e.savedAgo : e.saved });
|
|
15
|
+
}, m = ({ status: r, errorMessage: i, isRetryable: a, onRetry: m, className: h }) => {
|
|
16
|
+
let { labels: g } = n();
|
|
17
|
+
return /* @__PURE__ */ c("p", {
|
|
18
|
+
role: "status",
|
|
19
|
+
"aria-live": "polite",
|
|
20
|
+
className: e("flex min-h-5 max-w-[55%] items-center gap-1.5 text-xs text-muted-foreground", r === "error" && "text-destructive", h),
|
|
21
|
+
children: [
|
|
22
|
+
r === "saving" ? /* @__PURE__ */ c(o, { children: [/* @__PURE__ */ s(f, { className: "size-3.5 shrink-0 animate-spin" }), g.saving] }) : null,
|
|
23
|
+
r === "saved" ? /* @__PURE__ */ c(o, { children: [/* @__PURE__ */ s(u, { className: "size-3.5 shrink-0" }), /* @__PURE__ */ s(p, {})] }) : null,
|
|
24
|
+
r === "offline" ? /* @__PURE__ */ c(o, { children: [/* @__PURE__ */ s(d, { className: "size-3.5 shrink-0" }), g.offline] }) : null,
|
|
25
|
+
r === "error" ? /* @__PURE__ */ c(o, { children: [
|
|
26
|
+
/* @__PURE__ */ s(l, { className: "size-3.5 shrink-0" }),
|
|
27
|
+
/* @__PURE__ */ s("span", {
|
|
28
|
+
className: "truncate",
|
|
29
|
+
children: i || g.genericError
|
|
30
|
+
}),
|
|
31
|
+
a ? /* @__PURE__ */ s(t, {
|
|
32
|
+
type: "button",
|
|
33
|
+
variant: "link",
|
|
34
|
+
size: "sm",
|
|
35
|
+
className: "h-auto p-0 text-xs text-destructive underline",
|
|
36
|
+
onClick: m,
|
|
37
|
+
children: g.retry
|
|
38
|
+
}) : null
|
|
39
|
+
] }) : null
|
|
40
|
+
]
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
//#endregion
|
|
44
|
+
export { m as AutosaveStatus };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/autosave_status/index.tsx"],"sourcesContent":["import { useEditableFields } from \"@/components/editable_fields/hooks\";\nimport { Button } from \"@/components/button\";\nimport { AlertCircle, Check, CloudOff, Loader2 } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport { cn } from \"@/utilities/class\";\nimport { SAVED_LINGER_MS } from \"./constants\";\nimport type { AutosaveStatusValue } from \"./types\";\n\nexport interface AutosaveStatusProps {\n status: AutosaveStatusValue;\n errorMessage: string | null;\n isRetryable: boolean;\n onRetry: () => void;\n className?: string;\n}\n\nconst SavedStatusCopy = () => {\n const { labels } = useEditableFields();\n const [hasLingered, setHasLingered] = useState(false);\n useEffect(() => {\n const timer = setTimeout(() => setHasLingered(true), SAVED_LINGER_MS);\n return () => clearTimeout(timer);\n }, []);\n return <>{hasLingered ? labels.savedAgo : labels.saved}</>;\n};\n\nexport const AutosaveStatus = ({\n status,\n errorMessage,\n isRetryable,\n onRetry,\n className,\n}: AutosaveStatusProps) => {\n const { labels } = useEditableFields();\n\n return (\n <p\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n \"flex min-h-5 max-w-[55%] items-center gap-1.5 text-xs text-muted-foreground\",\n status === \"error\" && \"text-destructive\",\n className,\n )}\n >\n {status === \"saving\" ? (\n <>\n <Loader2 className=\"size-3.5 shrink-0 animate-spin\" />\n {labels.saving}\n </>\n ) : null}\n\n {status === \"saved\" ? (\n <>\n <Check className=\"size-3.5 shrink-0\" />\n <SavedStatusCopy />\n </>\n ) : null}\n\n {status === \"offline\" ? (\n <>\n <CloudOff className=\"size-3.5 shrink-0\" />\n {labels.offline}\n </>\n ) : null}\n\n {status === \"error\" ? (\n <>\n <AlertCircle className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">\n {errorMessage || labels.genericError}\n </span>\n {isRetryable ? (\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n className=\"h-auto p-0 text-xs text-destructive underline\"\n onClick={onRetry}\n >\n {labels.retry}\n </Button>\n ) : null}\n </>\n ) : null}\n </p>\n );\n};\n"],"mappings":";;;;;;;;AAgBA,IAAM,UAAwB;CAC5B,IAAM,EAAE,cAAW,GAAmB,EAChC,CAAC,GAAa,KAAkB,EAAS,GAAM;AAKrD,QAJA,QAAgB;EACd,IAAM,IAAQ,iBAAiB,EAAe,GAAK,EAAE,EAAgB;AACrE,eAAa,aAAa,EAAM;IAC/B,EAAE,CAAC,EACC,kBAAA,GAAA,EAAA,UAAG,IAAc,EAAO,WAAW,EAAO,OAAS,CAAA;GAG/C,KAAkB,EAC7B,WACA,iBACA,gBACA,YACA,mBACyB;CACzB,IAAM,EAAE,cAAW,GAAmB;AAEtC,QACE,kBAAC,KAAD;EACE,MAAK;EACL,aAAU;EACV,WAAW,EACT,+EACA,MAAW,WAAW,oBACtB,EACD;YAPH;GASG,MAAW,WACV,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAS,WAAU,kCAAmC,CAAA,EACrD,EAAO,OACP,EAAA,CAAA,GACD;GAEH,MAAW,UACV,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAO,WAAU,qBAAsB,CAAA,EACvC,kBAAC,GAAD,EAAmB,CAAA,CAClB,EAAA,CAAA,GACD;GAEH,MAAW,YACV,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAU,WAAU,qBAAsB,CAAA,EACzC,EAAO,QACP,EAAA,CAAA,GACD;GAEH,MAAW,UACV,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD,EAAa,WAAU,qBAAsB,CAAA;IAC7C,kBAAC,QAAD;KAAM,WAAU;eACb,KAAgB,EAAO;KACnB,CAAA;IACN,IACC,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,MAAK;KACL,WAAU;KACV,SAAS;eAER,EAAO;KACD,CAAA,GACP;IACH,EAAA,CAAA,GACD;GACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Locale } from 'date-fns';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
export interface EditableFieldLabels {
|
|
4
|
+
empty: string;
|
|
5
|
+
hint: string;
|
|
6
|
+
hours: string;
|
|
7
|
+
minutes: string;
|
|
8
|
+
saving: string;
|
|
9
|
+
saved: string;
|
|
10
|
+
savedAgo: string;
|
|
11
|
+
offline: string;
|
|
12
|
+
genericError: string;
|
|
13
|
+
retry: string;
|
|
14
|
+
acceptColor: string;
|
|
15
|
+
clearColor: string;
|
|
16
|
+
selectColor: string;
|
|
17
|
+
changeColor: string;
|
|
18
|
+
currentColor: string;
|
|
19
|
+
}
|
|
20
|
+
export interface EditableFieldsConfig {
|
|
21
|
+
labels: EditableFieldLabels;
|
|
22
|
+
locale: Locale;
|
|
23
|
+
dateFormat: string;
|
|
24
|
+
tableDateFormat: string;
|
|
25
|
+
swatches: readonly string[];
|
|
26
|
+
}
|
|
27
|
+
export interface EditableFieldsProviderProps extends Partial<Omit<EditableFieldsConfig, "labels">> {
|
|
28
|
+
labels?: Partial<EditableFieldLabels>;
|
|
29
|
+
children: ReactNode;
|
|
30
|
+
}
|
|
31
|
+
export declare const EditableFieldsContext: import('react').Context<EditableFieldsConfig>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { HEX_COLOR_SWATCHES as e } from "../../hex_color_picker/utils/index.js";
|
|
2
|
+
import { createContext as t } from "react";
|
|
3
|
+
import { es as n } from "date-fns/locale";
|
|
4
|
+
var r = t({
|
|
5
|
+
labels: {
|
|
6
|
+
empty: "Añadir…",
|
|
7
|
+
hint: "Enter para guardar · Esc para descartar",
|
|
8
|
+
hours: "Horas",
|
|
9
|
+
minutes: "Minutos",
|
|
10
|
+
saving: "Guardando…",
|
|
11
|
+
saved: "Guardado",
|
|
12
|
+
savedAgo: "Guardado hace un momento",
|
|
13
|
+
offline: "Sin conexión · se guardará al reconectar",
|
|
14
|
+
genericError: "No se pudo guardar el cambio. Revisa tu conexión.",
|
|
15
|
+
retry: "Reintentar",
|
|
16
|
+
acceptColor: "Aceptar",
|
|
17
|
+
clearColor: "Quitar color",
|
|
18
|
+
selectColor: "Seleccionar color",
|
|
19
|
+
changeColor: "Cambiar color",
|
|
20
|
+
currentColor: "actual"
|
|
21
|
+
},
|
|
22
|
+
locale: n,
|
|
23
|
+
dateFormat: "dd 'de' MMMM 'del' yyyy",
|
|
24
|
+
tableDateFormat: "dd MMM yyyy",
|
|
25
|
+
swatches: e
|
|
26
|
+
});
|
|
27
|
+
//#endregion
|
|
28
|
+
export { r as EditableFieldsContext };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/editable_fields/context/index.ts"],"sourcesContent":["import { es } from \"date-fns/locale\";\nimport type { Locale } from \"date-fns\";\nimport { createContext, type ReactNode } from \"react\";\nimport { HEX_COLOR_SWATCHES } from \"../../hex_color_picker/utils\";\n\nexport interface EditableFieldLabels {\n empty: string;\n hint: string;\n hours: string;\n minutes: string;\n saving: string;\n saved: string;\n savedAgo: string;\n offline: string;\n genericError: string;\n retry: string;\n acceptColor: string;\n clearColor: string;\n selectColor: string;\n changeColor: string;\n currentColor: string;\n}\n\nexport interface EditableFieldsConfig {\n labels: EditableFieldLabels;\n locale: Locale;\n dateFormat: string;\n tableDateFormat: string;\n swatches: readonly string[];\n}\n\nexport interface EditableFieldsProviderProps extends Partial<\n Omit<EditableFieldsConfig, \"labels\">\n> {\n labels?: Partial<EditableFieldLabels>;\n children: ReactNode;\n}\n\nconst defaults: EditableFieldsConfig = {\n labels: {\n empty: \"Añadir…\",\n hint: \"Enter para guardar · Esc para descartar\",\n hours: \"Horas\",\n minutes: \"Minutos\",\n saving: \"Guardando…\",\n saved: \"Guardado\",\n savedAgo: \"Guardado hace un momento\",\n offline: \"Sin conexión · se guardará al reconectar\",\n genericError: \"No se pudo guardar el cambio. Revisa tu conexión.\",\n retry: \"Reintentar\",\n acceptColor: \"Aceptar\",\n clearColor: \"Quitar color\",\n selectColor: \"Seleccionar color\",\n changeColor: \"Cambiar color\",\n currentColor: \"actual\",\n },\n locale: es,\n dateFormat: \"dd 'de' MMMM 'del' yyyy\",\n tableDateFormat: \"dd MMM yyyy\",\n swatches: HEX_COLOR_SWATCHES,\n};\n\nexport const EditableFieldsContext =\n createContext<EditableFieldsConfig>(defaults);\n"],"mappings":";;;AA8DA,IAAa,IACX,EAzBqC;CACrC,QAAQ;EACN,OAAO;EACP,MAAM;EACN,OAAO;EACP,SAAS;EACT,QAAQ;EACR,OAAO;EACP,UAAU;EACV,SAAS;EACT,cAAc;EACd,OAAO;EACP,aAAa;EACb,YAAY;EACZ,aAAa;EACb,aAAa;EACb,cAAc;EACf;CACD,QAAQ;CACR,YAAY;CACZ,iBAAiB;CACjB,UAAU;CACX,CAG8C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const useEditableFields: () => import('../context').EditableFieldsConfig;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { EditableFieldsContext as e } from "../context/index.js";
|
|
2
|
+
import { useContext as t } from "react";
|
|
3
|
+
//#region src/components/editable_fields/hooks/index.ts
|
|
4
|
+
var n = () => t(e);
|
|
5
|
+
//#endregion
|
|
6
|
+
export { n as useEditableFields };
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/editable_fields/hooks/index.ts"],"sourcesContent":["import { useContext } from \"react\";\nimport { EditableFieldsContext } from \"../context\";\nexport const useEditableFields = () => useContext(EditableFieldsContext);\n"],"mappings":";;;AAEA,IAAa,UAA0B,EAAW,EAAsB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { EditableFieldsProviderProps } from './context';
|
|
2
|
+
export type { EditableFieldsProviderProps } from './context';
|
|
3
|
+
export declare const EditableFieldsProvider: ({ children, labels, locale, dateFormat, tableDateFormat, swatches, }: EditableFieldsProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { EditableFieldsContext as e } from "./context/index.js";
|
|
2
|
+
import { useEditableFields as t } from "./hooks/index.js";
|
|
3
|
+
import { useMemo as n } from "react";
|
|
4
|
+
import { jsx as r } from "react/jsx-runtime";
|
|
5
|
+
//#region src/components/editable_fields/index.tsx
|
|
6
|
+
var i = ({ children: i, labels: a, locale: o, dateFormat: s, tableDateFormat: c, swatches: l }) => {
|
|
7
|
+
let u = t(), d = n(() => ({
|
|
8
|
+
labels: {
|
|
9
|
+
...u.labels,
|
|
10
|
+
...a
|
|
11
|
+
},
|
|
12
|
+
locale: o ?? u.locale,
|
|
13
|
+
dateFormat: s ?? u.dateFormat,
|
|
14
|
+
tableDateFormat: c ?? u.tableDateFormat,
|
|
15
|
+
swatches: l ?? u.swatches
|
|
16
|
+
}), [
|
|
17
|
+
u,
|
|
18
|
+
a,
|
|
19
|
+
o,
|
|
20
|
+
s,
|
|
21
|
+
c,
|
|
22
|
+
l
|
|
23
|
+
]);
|
|
24
|
+
return /* @__PURE__ */ r(e.Provider, {
|
|
25
|
+
value: d,
|
|
26
|
+
children: i
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
//#endregion
|
|
30
|
+
export { i as EditableFieldsProvider };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/editable_fields/index.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport {\n EditableFieldsContext,\n type EditableFieldsProviderProps,\n} from \"./context\";\nimport { useEditableFields } from \"./hooks\";\nexport type { EditableFieldsProviderProps } from \"./context\";\n\nexport const EditableFieldsProvider = ({\n children,\n labels,\n locale,\n dateFormat,\n tableDateFormat,\n swatches,\n}: EditableFieldsProviderProps) => {\n const parent = useEditableFields();\n const value = useMemo(\n () => ({\n labels: { ...parent.labels, ...labels },\n locale: locale ?? parent.locale,\n dateFormat: dateFormat ?? parent.dateFormat,\n tableDateFormat: tableDateFormat ?? parent.tableDateFormat,\n swatches: swatches ?? parent.swatches,\n }),\n [parent, labels, locale, dateFormat, tableDateFormat, swatches],\n );\n return (\n <EditableFieldsContext.Provider value={value}>\n {children}\n </EditableFieldsContext.Provider>\n );\n};\n"],"mappings":";;;;;AAQA,IAAa,KAA0B,EACrC,aACA,WACA,WACA,eACA,oBACA,kBACiC;CACjC,IAAM,IAAS,GAAmB,EAC5B,IAAQ,SACL;EACL,QAAQ;GAAE,GAAG,EAAO;GAAQ,GAAG;GAAQ;EACvC,QAAQ,KAAU,EAAO;EACzB,YAAY,KAAc,EAAO;EACjC,iBAAiB,KAAmB,EAAO;EAC3C,UAAU,KAAY,EAAO;EAC9B,GACD;EAAC;EAAQ;EAAQ;EAAQ;EAAY;EAAiB;EAAS,CAChE;AACD,QACE,kBAAC,EAAsB,UAAvB;EAAuC;EACpC;EAC8B,CAAA"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { EmojiPicker as EmojiPickerPrimitive } from 'frimousse';
|
|
2
2
|
import type * as React from "react";
|
|
3
|
-
declare const EmojiPickerContent: ({ className, ...props }: React.ComponentProps<typeof EmojiPickerPrimitive.Viewport>
|
|
3
|
+
declare const EmojiPickerContent: ({ className, emptyLabel, ...props }: React.ComponentProps<typeof EmojiPickerPrimitive.Viewport> & {
|
|
4
|
+
emptyLabel?: React.ReactNode;
|
|
5
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
4
6
|
export { EmojiPickerContent };
|
|
@@ -6,10 +6,10 @@ import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
|
6
6
|
import { LoaderIcon as o } from "lucide-react";
|
|
7
7
|
import { EmojiPicker as s } from "frimousse";
|
|
8
8
|
//#region src/components/emoji_picker/components/emoji_picker_content/index.tsx
|
|
9
|
-
var c = ({ className: c,
|
|
9
|
+
var c = ({ className: c, emptyLabel: l = "Emoji no encontrado.", ...u }) => /* @__PURE__ */ a(s.Viewport, {
|
|
10
10
|
className: e("outline-hidden relative flex-1", c),
|
|
11
11
|
"data-slot": "emoji-picker-viewport",
|
|
12
|
-
...
|
|
12
|
+
...u,
|
|
13
13
|
children: [
|
|
14
14
|
/* @__PURE__ */ i(s.Loading, {
|
|
15
15
|
className: "absolute inset-0 flex items-center justify-center text-muted-foreground",
|
|
@@ -19,7 +19,7 @@ var c = ({ className: c, ...l }) => /* @__PURE__ */ a(s.Viewport, {
|
|
|
19
19
|
/* @__PURE__ */ i(s.Empty, {
|
|
20
20
|
className: "absolute inset-0 flex items-center justify-center text-muted-foreground text-sm",
|
|
21
21
|
"data-slot": "emoji-picker-empty",
|
|
22
|
-
children:
|
|
22
|
+
children: l
|
|
23
23
|
}),
|
|
24
24
|
/* @__PURE__ */ i(s.List, {
|
|
25
25
|
className: "select-none pb-1",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../src/components/emoji_picker/components/emoji_picker_content/index.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../src/components/emoji_picker/components/emoji_picker_content/index.tsx"],"sourcesContent":["import { EmojiPicker as EmojiPickerPrimitive } from \"frimousse\";\nimport { LoaderIcon } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"@/utilities/index\";\n\nimport { EmojiPickerCategoryHeader } from \"../emoji_picker_category_header\";\nimport { EmojiPickerEmoji } from \"../emoji_picker_emoji\";\nimport { EmojiPickerRow } from \"../emoji_picker_row\";\n\nconst EmojiPickerContent = ({\n className,\n emptyLabel = \"Emoji no encontrado.\",\n ...props\n}: React.ComponentProps<typeof EmojiPickerPrimitive.Viewport> & {\n emptyLabel?: React.ReactNode;\n}) => {\n return (\n <EmojiPickerPrimitive.Viewport\n className={cn(\"outline-hidden relative flex-1\", className)}\n data-slot=\"emoji-picker-viewport\"\n {...props}\n >\n <EmojiPickerPrimitive.Loading\n className=\"absolute inset-0 flex items-center justify-center text-muted-foreground\"\n data-slot=\"emoji-picker-loading\"\n >\n <LoaderIcon className=\"size-4 animate-spin\" />\n </EmojiPickerPrimitive.Loading>\n <EmojiPickerPrimitive.Empty\n className=\"absolute inset-0 flex items-center justify-center text-muted-foreground text-sm\"\n data-slot=\"emoji-picker-empty\"\n >\n {emptyLabel}\n </EmojiPickerPrimitive.Empty>\n <EmojiPickerPrimitive.List\n className=\"select-none pb-1\"\n components={{\n Row: EmojiPickerRow,\n Emoji: EmojiPickerEmoji,\n CategoryHeader: EmojiPickerCategoryHeader,\n }}\n data-slot=\"emoji-picker-list\"\n />\n </EmojiPickerPrimitive.Viewport>\n );\n};\n\nexport { EmojiPickerContent };\n"],"mappings":";;;;;;;;AASA,IAAM,KAAsB,EAC1B,cACA,gBAAa,wBACb,GAAG,QAKD,kBAAC,EAAqB,UAAtB;CACE,WAAW,EAAG,kCAAkC,EAAU;CAC1D,aAAU;CACV,GAAI;WAHN;EAKE,kBAAC,EAAqB,SAAtB;GACE,WAAU;GACV,aAAU;aAEV,kBAAC,GAAD,EAAY,WAAU,uBAAwB,CAAA;GACjB,CAAA;EAC/B,kBAAC,EAAqB,OAAtB;GACE,WAAU;GACV,aAAU;aAET;GAC0B,CAAA;EAC7B,kBAAC,EAAqB,MAAtB;GACE,WAAU;GACV,YAAY;IACV,KAAK;IACL,OAAO;IACP,gBAAgB;IACjB;GACD,aAAU;GACV,CAAA;EAC4B"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import type * as React from "react";
|
|
2
|
-
declare const EmojiPickerFooter: ({ className, ...props }: React.ComponentProps<"div">
|
|
2
|
+
declare const EmojiPickerFooter: ({ className, emptyLabel, ...props }: React.ComponentProps<"div"> & {
|
|
3
|
+
emptyLabel?: React.ReactNode;
|
|
4
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
3
5
|
export { EmojiPickerFooter };
|