@object-ui/components 17.5.0 → 17.7.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/CHANGELOG.md +10155 -0
- package/README.md +20 -10
- package/dist/custom/button-group.d.ts +2 -2
- package/dist/custom/character-count.d.ts +56 -0
- package/dist/custom/combobox.d.ts +2 -4
- package/dist/custom/config-field-renderer.d.ts +1 -1
- package/dist/custom/config-panel-renderer.d.ts +3 -3
- package/dist/custom/empty.d.ts +16 -4
- package/dist/custom/field.d.ts +1 -1
- package/dist/custom/filter-builder.d.ts +448 -36
- package/dist/custom/fullscreen-editor.d.ts +48 -2
- package/dist/custom/index.d.ts +27 -28
- package/dist/custom/item.d.ts +2 -2
- package/dist/custom/kbd.d.ts +1 -1
- package/dist/custom/mobile-dialog-content.d.ts +22 -1
- package/dist/custom/navigation-overlay.d.ts +105 -0
- package/dist/custom/refresh-indicator.d.ts +8 -2
- package/dist/custom/resizable.d.ts +1 -1
- package/dist/custom/view-states.d.ts +74 -1
- package/dist/debug/index.d.ts +2 -2
- package/dist/hooks/related-count-store.d.ts +26 -28
- package/dist/index.css +174 -364
- package/dist/index.d.ts +21 -21
- package/dist/index.js +7274 -6350
- package/dist/index.umd.cjs +12 -13
- package/dist/lib/close-label.d.ts +1 -2
- package/dist/lib/date-fns-locale.d.ts +41 -0
- package/dist/lib/form-control-dom-props.d.ts +77 -0
- package/dist/lib/lazy-icon.d.ts +32 -1
- package/dist/lib/lucide-record-icon-names.d.ts +30 -0
- package/dist/lib/slider-thumb.d.ts +86 -0
- package/dist/lib/utils.d.ts +113 -0
- package/dist/notifications/index.d.ts +5 -5
- package/dist/renderers/action/action-bar.d.ts +8 -36
- package/dist/renderers/action/action-button.d.ts +15 -4
- package/dist/renderers/action/action-group.d.ts +5 -4
- package/dist/renderers/action/action-icon.d.ts +12 -2
- package/dist/renderers/action/action-menu.d.ts +5 -2
- package/dist/renderers/action/auto-trigger.d.ts +19 -4
- package/dist/renderers/action/resolve-icon.d.ts +27 -2
- package/dist/renderers/action/static-params.d.ts +79 -0
- package/dist/renderers/action/visibility-gate.d.ts +11 -3
- package/dist/renderers/basic/elements.d.ts +6 -3
- package/dist/renderers/basic/html-elements.d.ts +8 -4
- package/dist/renderers/basic/readProps.d.ts +60 -0
- package/dist/renderers/complex/data-table.d.ts +31 -14
- package/dist/renderers/complex/dataTableBindDiagnostic.d.ts +187 -0
- package/dist/renderers/form/validationRuleKeys.d.ts +45 -0
- package/dist/renderers/layout/box.d.ts +8 -0
- package/dist/renderers/layout/containers.d.ts +1 -10
- package/dist/renderers/layout/react-page.d.ts +16 -2
- package/dist/renderers/navigation/sidebar.d.ts +31 -0
- package/dist/share/index.d.ts +2 -2
- package/dist/ui/badge.d.ts +1 -1
- package/dist/ui/button.d.ts +1 -1
- package/dist/ui/calendar.d.ts +3 -2
- package/dist/ui/carousel.d.ts +2 -2
- package/dist/ui/command.d.ts +8 -8
- package/dist/ui/form.d.ts +1 -1
- package/dist/ui/index.d.ts +46 -47
- package/dist/ui/input-otp.d.ts +2 -2
- package/dist/ui/pagination.d.ts +1 -1
- package/dist/ui/sheet.d.ts +1 -1
- package/dist/ui/sidebar.d.ts +4 -3
- package/dist/ui/slider.d.ts +2 -1
- package/package.json +17 -18
- package/dist/SchemaRenderer.d.ts +0 -4
- package/dist/custom/action-param-dialog.d.ts +0 -21
- package/dist/custom/export-progress-dialog.d.ts +0 -43
- package/dist/hooks/use-export-job.d.ts +0 -34
- package/dist/renderers/data-display/table.d.ts +0 -2
- package/dist/ui/chart.d.ts +0 -56
- package/dist/ui/toast.d.ts +0 -22
|
@@ -31,8 +31,7 @@
|
|
|
31
31
|
* The no-provider path must stay English. A large number of existing unit
|
|
32
32
|
* tests and e2e specs address dialogs and drawers by their English accessible
|
|
33
33
|
* name with no `I18nProvider` mounted (e.g.
|
|
34
|
-
* `packages/plugin-form/src/discardGuard.test.tsx
|
|
35
|
-
* `packages/plugin-detail/src/__tests__/InlineCreateRelated.closeButtonName.test.tsx`),
|
|
34
|
+
* `packages/plugin-form/src/discardGuard.test.tsx`),
|
|
36
35
|
* and a primitive that rendered a raw `common.close` key there would break all
|
|
37
36
|
* of them. `createSafeTranslation` probes its test key and falls back to the
|
|
38
37
|
* defaults map below when translations are not configured, so "no provider"
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Locale } from 'date-fns';
|
|
2
|
+
/** Every locale code this module can answer with: the loaders' keys, and `en-US`. */
|
|
3
|
+
export declare const DATE_LOCALE_KEYS: readonly string[];
|
|
4
|
+
/**
|
|
5
|
+
* The date-fns locale code a BCP-47 tag reads, by the chain in the header:
|
|
6
|
+
* the tag as given, its language with the region, then with the script, that
|
|
7
|
+
* `maximize()` gives it, then its bare language, then `en-US`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function dateLocaleKeyFor(tag: string): string;
|
|
10
|
+
/** The locale for `key` if it has been loaded, without loading it. */
|
|
11
|
+
export declare function loadedDateLocale(key: string): Locale | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Load the locale for `key`. Memoised: a loaded locale is returned without a
|
|
14
|
+
* second import, and concurrent callers share one promise. ⛔ A rejected load
|
|
15
|
+
* is not memoised, so a chunk that failed to download can be fetched again.
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadDateLocale(key: string): Promise<Locale>;
|
|
18
|
+
/**
|
|
19
|
+
* `Calendar`'s input that names its locale as a BCP-47 TAG (objectui#10747).
|
|
20
|
+
*
|
|
21
|
+
* Declared here, beside the resolver it feeds, so the patch that adds it to the
|
|
22
|
+
* No-Touch `ui/calendar.tsx` stays a one-line reference.
|
|
23
|
+
*/
|
|
24
|
+
export interface CalendarLocaleTagProps {
|
|
25
|
+
/**
|
|
26
|
+
* The BCP-47 tag this calendar's caption, weekday heads and week start read,
|
|
27
|
+
* in place of the session's display locale: the tag a host already formats
|
|
28
|
+
* its own dates with, such as `CalendarView`'s `effectiveLocale`. It is
|
|
29
|
+
* resolved by the chain in this module's header, so `de-CH` reads date-fns
|
|
30
|
+
* `de`, and a tag date-fns has no locale for, or a malformed one, reads
|
|
31
|
+
* `enUS`. Absent, the calendar reads the display locale. A date-fns `locale`
|
|
32
|
+
* object passed to `Calendar` still wins over both.
|
|
33
|
+
*/
|
|
34
|
+
localeTag?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The date-fns `Locale` for `tag`, or for the session's display locale when no
|
|
38
|
+
* tag is given (objectui#10747): an explicit tag wins. It reads `enUS` until
|
|
39
|
+
* that locale has loaded, then re-renders its caller with it.
|
|
40
|
+
*/
|
|
41
|
+
export declare function useDisplayDateLocale(tag?: string): Locale;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { DomProps as CoreDomProps } from '@object-ui/core';
|
|
2
|
+
/**
|
|
3
|
+
* The DOM pass-through declaration for the `packages/components` renderers whose
|
|
4
|
+
* host element is a FORM CONTROL (objectui#5632).
|
|
5
|
+
*
|
|
6
|
+
* ## Why this exists at all, rather than a bare `toDomProps`
|
|
7
|
+
*
|
|
8
|
+
* `toDomProps` is the SDUI contract's executor and its key list is deliberately
|
|
9
|
+
* ELEMENT-AGNOSTIC — it cannot know what element the widget renders, so it
|
|
10
|
+
* carries only what is legal on every element. `name` and `disabled` are legal
|
|
11
|
+
* on form controls and nowhere else, which is exactly why `dom-props.ts` leaves
|
|
12
|
+
* them out: `name` on the `<div>` a container widget renders is one of the 14
|
|
13
|
+
* attributes objectui#4431 closed.
|
|
14
|
+
*
|
|
15
|
+
* The renderers in this group render the other case. Routing them through the
|
|
16
|
+
* bare SDUI list would strip `name` and `disabled` off real controls — and
|
|
17
|
+
* `packages/fields` already wrote down what that costs, in the same words, for
|
|
18
|
+
* the same two keys:
|
|
19
|
+
*
|
|
20
|
+
* > Withholding them would make this helper a silent styling- and
|
|
21
|
+
* > interactivity-dropper … That is a NEW silent failure of exactly the kind
|
|
22
|
+
* > the whitelist exists to prevent, so they are forwarded.
|
|
23
|
+
*
|
|
24
|
+
* It is worth being precise about how INVISIBLE that failure would be here.
|
|
25
|
+
* The gate that grades this change
|
|
26
|
+
* (`packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx`) reports
|
|
27
|
+
* attributes that ARRIVE illegitimately; it has no case for an attribute that
|
|
28
|
+
* stops arriving, and its canary node authors no `disabled` at all. So dropping
|
|
29
|
+
* `disabled` off every form control in the library would have moved not one
|
|
30
|
+
* number in this card's own acceptance evidence. The ledger predicted the same
|
|
31
|
+
* thing from the other side — its `BARE_SPREAD_MINUS_NAME` note says converging
|
|
32
|
+
* this group "will not change that attribute, only the thirteen around it" —
|
|
33
|
+
* and that prediction is only true if `name` is forwarded deliberately.
|
|
34
|
+
*
|
|
35
|
+
* ## One mechanism, three declarations
|
|
36
|
+
*
|
|
37
|
+
* This is the third declaration over the ONE mechanism in
|
|
38
|
+
* `@object-ui/core`'s `pickDomProps`, and it follows the pattern
|
|
39
|
+
* `@object-ui/fields` established rather than inventing one: the consuming
|
|
40
|
+
* package owns the key list its own contract implies, and calls the shared
|
|
41
|
+
* filter with it. The three, and what separates them:
|
|
42
|
+
*
|
|
43
|
+
* - `toDomProps` (`@object-ui/core`) — the SDUI baseline, element-agnostic.
|
|
44
|
+
* - `@object-ui/fields`' `toDomProps` — the baseline minus `role`, plus `name`
|
|
45
|
+
* and `disabled`; `FieldWidgetComponentProps` declares the closed set.
|
|
46
|
+
* - this one — the baseline PLUS `name` and `disabled`, nothing removed. It is
|
|
47
|
+
* a strict superset of the SDUI list, which the compile-time assertion below
|
|
48
|
+
* pins, so a key added to the shared set can never be quietly dropped here.
|
|
49
|
+
*
|
|
50
|
+
* Anything beyond this set is still the objectui#4435 route: DECLARE it and
|
|
51
|
+
* forward it by name. Do not reopen the spread (AGENTS.md #0.1 — fix the
|
|
52
|
+
* contract, never widen the consumer). `style` is the standing example, and it
|
|
53
|
+
* is forwarded by name at every call site for exactly that reason.
|
|
54
|
+
*/
|
|
55
|
+
declare const FORM_CONTROL_DOM_PASS_THROUGH_KEYS: readonly ["id", "className", "role", "tabIndex", "autoFocus", "onClick", "onBlur", "onFocus", "name", "disabled"];
|
|
56
|
+
type FormControlDomPassThroughKey = (typeof FORM_CONTROL_DOM_PASS_THROUGH_KEYS)[number];
|
|
57
|
+
/** The subset of `P` this declaration forwards, with each key's declared type. */
|
|
58
|
+
export type FormControlDomProps<P> = CoreDomProps<P, FormControlDomPassThroughKey>;
|
|
59
|
+
/**
|
|
60
|
+
* Keep only what may legitimately become an attribute on a FORM CONTROL, and
|
|
61
|
+
* drop everything else — the injected `schema`, the data-source adapter, the
|
|
62
|
+
* authored node's SDUI metadata, the flattened `props` container, and every
|
|
63
|
+
* declared prop the renderer already consumed off `schema`.
|
|
64
|
+
*
|
|
65
|
+
* Replaces the bare `{...rest}` spread in a form-control registration:
|
|
66
|
+
*
|
|
67
|
+
* ```tsx
|
|
68
|
+
* // before — forwards whatever `SchemaRenderer` handed it
|
|
69
|
+
* const { style, ...rest } = props;
|
|
70
|
+
* return <Input name={schema.name} {...rest} />;
|
|
71
|
+
*
|
|
72
|
+
* // after
|
|
73
|
+
* return <Input name={schema.name} {...toFormControlDomProps(rest)} style={style} />;
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare function toFormControlDomProps<P extends object>(props: P): FormControlDomProps<P>;
|
|
77
|
+
export {};
|
package/dist/lib/lazy-icon.d.ts
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Convert PascalCase / camelCase / mixed names to kebab-case for DynamicIcon.
|
|
4
|
+
*
|
|
5
|
+
* The transform is the INVERSE of lucide's own `toPascalCase`, which is what
|
|
6
|
+
* builds every exported component name out of a canonical icon name: it drops
|
|
7
|
+
* each hyphen and upper-cases the character that followed it. So the job here
|
|
8
|
+
* is to put a boundary back wherever `toPascalCase` removed one, and nowhere
|
|
9
|
+
* else. Three rules do it, and each one answers a different shape of boundary:
|
|
10
|
+
*
|
|
11
|
+
* 1. `lower-or-digit -> Upper` — the ordinary word boundary (`ChevronRight`).
|
|
12
|
+
* 2. `acronym-run -> Word` — a run of capitals followed by a word
|
|
13
|
+
* (`SVGIcon`), where rule 1 would swallow the last capital.
|
|
14
|
+
* 3. `letter -> digit` — the boundary a digit-suffixed name carries
|
|
15
|
+
* (`Building2` -> `building-2`). ⚠️ It is NOT unconditional: the negative
|
|
16
|
+
* lookbehind holds the rule off when the letter is itself preceded by a
|
|
17
|
+
* digit, because that is lucide's grid spelling — `Grid2x2` is the Pascal
|
|
18
|
+
* form of `grid-2x2`, where the `x` sits INSIDE a segment rather than
|
|
19
|
+
* starting one. Splitting there produces `grid-2x-2`, which is not a name.
|
|
20
|
+
*
|
|
21
|
+
* ⛔ Rule 3 is the boundary the seam went without until objectui#9414, and the
|
|
22
|
+
* cost was not visible anywhere: `Building2` — the spelling `lucide-react`
|
|
23
|
+
* exports and lucide's own site shows — tokenised to `building2`, matched no
|
|
24
|
+
* canonical name, and `getLazyIcon` degraded it to the `Database` glyph with no
|
|
25
|
+
* error, no warning and no log. The author saw *an* icon and no signal that it
|
|
26
|
+
* was not theirs.
|
|
27
|
+
*
|
|
28
|
+
* ⛔ Do not write down how many names rule 3 recovers. The property that matters
|
|
29
|
+
* is re-derived from the installed lucide on every run by
|
|
30
|
+
* `__tests__/lazy-icon-digit-boundary-9414.test.ts`: every canonical icon name
|
|
31
|
+
* is reachable from its own exported PascalCase spelling, and every name the
|
|
32
|
+
* pre-#9414 tokeniser resolved still resolves to the byte-identical result.
|
|
33
|
+
*/
|
|
3
34
|
export declare function toKebabIconName(name: string): string;
|
|
4
35
|
/**
|
|
5
36
|
* Whether `name` (kebab-case or PascalCase) resolves to a real Lucide icon.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* GENERATED FILE — do not edit by hand.
|
|
10
|
+
*
|
|
11
|
+
* Regenerate: node scripts/regenerate-lucide-record-icon-names.mjs
|
|
12
|
+
* Verified by: scripts/check-lucide-icon-record-names.mjs (part 4), which also
|
|
13
|
+
* proves this list is the same vocabulary as lucide's runtime
|
|
14
|
+
* `icons` record.
|
|
15
|
+
*
|
|
16
|
+
* The legal icon-name set for `renderers/action/resolve-icon.ts`, as read out
|
|
17
|
+
* of lucide's own export manifest at generation time.
|
|
18
|
+
*
|
|
19
|
+
* Each entry is `PascalCaseKey:kebab-module-name`. The first is what the seam
|
|
20
|
+
* looks a tokenised author-supplied name up by; the second is what
|
|
21
|
+
* `DynamicIcon` loads. ⛔ The second is NOT derivable from the first by a
|
|
22
|
+
* regex — many of these keys carry digits or leading initials that lucide
|
|
23
|
+
* splits and a conversion does not (`ArrowDown01` is `arrow-down-0-1`,
|
|
24
|
+
* `Axis3d` is `axis-3d`).
|
|
25
|
+
*
|
|
26
|
+
* ⛔ This list is deliberately NOT `Object.keys(icons)`. That derivation is the
|
|
27
|
+
* eager record written a second way: indexing the record pulls every icon
|
|
28
|
+
* module into the eager closure, which is the payload objectui#9251 removed.
|
|
29
|
+
*/
|
|
30
|
+
export declare const LUCIDE_RECORD_ICON_NAME_TABLE = "AArrowDown:a-arrow-down,AArrowUp:a-arrow-up,ALargeSmall:a-large-small,Accessibility:accessibility,Activity:activity,Ad:ad,AirVent:air-vent,Airplay:airplay,AlarmClock:alarm-clock,AlarmClockCheck:alarm-clock-check,AlarmClockMinus:alarm-clock-minus,AlarmClockOff:alarm-clock-off,AlarmClockPlus:alarm-clock-plus,AlarmSmoke:alarm-smoke,Album:album,AlignCenterHorizontal:align-center-horizontal,AlignCenterVertical:align-center-vertical,AlignEndHorizontal:align-end-horizontal,AlignEndVertical:align-end-vertical,AlignHorizontalDistributeCenter:align-horizontal-distribute-center,AlignHorizontalDistributeEnd:align-horizontal-distribute-end,AlignHorizontalDistributeStart:align-horizontal-distribute-start,AlignHorizontalJustifyCenter:align-horizontal-justify-center,AlignHorizontalJustifyEnd:align-horizontal-justify-end,AlignHorizontalJustifyStart:align-horizontal-justify-start,AlignHorizontalSpaceAround:align-horizontal-space-around,AlignHorizontalSpaceBetween:align-horizontal-space-between,AlignStartHorizontal:align-start-horizontal,AlignStartVertical:align-start-vertical,AlignVerticalDistributeCenter:align-vertical-distribute-center,AlignVerticalDistributeEnd:align-vertical-distribute-end,AlignVerticalDistributeStart:align-vertical-distribute-start,AlignVerticalJustifyCenter:align-vertical-justify-center,AlignVerticalJustifyEnd:align-vertical-justify-end,AlignVerticalJustifyStart:align-vertical-justify-start,AlignVerticalSpaceAround:align-vertical-space-around,AlignVerticalSpaceBetween:align-vertical-space-between,Ambulance:ambulance,Ampersand:ampersand,Ampersands:ampersands,Amphora:amphora,Anchor:anchor,Angle:angle,Antenna:antenna,Anvil:anvil,Aperture:aperture,AppWindow:app-window,AppWindowMac:app-window-mac,Apple:apple,Archive:archive,ArchiveRestore:archive-restore,ArchiveX:archive-x,Armchair:armchair,ArrowBigDown:arrow-big-down,ArrowBigDownDash:arrow-big-down-dash,ArrowBigLeft:arrow-big-left,ArrowBigLeftDash:arrow-big-left-dash,ArrowBigRight:arrow-big-right,ArrowBigRightDash:arrow-big-right-dash,ArrowBigUp:arrow-big-up,ArrowBigUpDash:arrow-big-up-dash,ArrowDown:arrow-down,ArrowDown01:arrow-down-0-1,ArrowDown10:arrow-down-1-0,ArrowDownAZ:arrow-down-a-z,ArrowDownFromLine:arrow-down-from-line,ArrowDownLeft:arrow-down-left,ArrowDownNarrowWide:arrow-down-narrow-wide,ArrowDownRight:arrow-down-right,ArrowDownToDot:arrow-down-to-dot,ArrowDownToLine:arrow-down-to-line,ArrowDownUp:arrow-down-up,ArrowDownWideNarrow:arrow-down-wide-narrow,ArrowDownZA:arrow-down-z-a,ArrowLeft:arrow-left,ArrowLeftFromLine:arrow-left-from-line,ArrowLeftRight:arrow-left-right,ArrowLeftToLine:arrow-left-to-line,ArrowRight:arrow-right,ArrowRightFromLine:arrow-right-from-line,ArrowRightLeft:arrow-right-left,ArrowRightToLine:arrow-right-to-line,ArrowUp:arrow-up,ArrowUp01:arrow-up-0-1,ArrowUp10:arrow-up-1-0,ArrowUpAZ:arrow-up-a-z,ArrowUpDown:arrow-up-down,ArrowUpFromDot:arrow-up-from-dot,ArrowUpFromLine:arrow-up-from-line,ArrowUpLeft:arrow-up-left,ArrowUpNarrowWide:arrow-up-narrow-wide,ArrowUpRight:arrow-up-right,ArrowUpToLine:arrow-up-to-line,ArrowUpWideNarrow:arrow-up-wide-narrow,ArrowUpZA:arrow-up-z-a,ArrowsUpFromLine:arrows-up-from-line,Asterisk:asterisk,Astroid:astroid,AtSign:at-sign,Atom:atom,AudioLines:audio-lines,AudioLinesOff:audio-lines-off,AudioLinesX:audio-lines-x,AudioWaveform:audio-waveform,Award:award,Axe:axe,Axis3d:axis-3d,Baby:baby,Backpack:backpack,Badge:badge,BadgeAlert:badge-alert,BadgeCent:badge-cent,BadgeCheck:badge-check,BadgeDollarSign:badge-dollar-sign,BadgeEuro:badge-euro,BadgeIndianRupee:badge-indian-rupee,BadgeInfo:badge-info,BadgeJapaneseYen:badge-japanese-yen,BadgeMinus:badge-minus,BadgePercent:badge-percent,BadgePlus:badge-plus,BadgePoundSterling:badge-pound-sterling,BadgeQuestionMark:badge-question-mark,BadgeRussianRuble:badge-russian-ruble,BadgeSwissFranc:badge-swiss-franc,BadgeTurkishLira:badge-turkish-lira,BadgeX:badge-x,BaggageClaim:baggage-claim,Balloon:balloon,Ban:ban,Banana:banana,Bandage:bandage,Banknote:banknote,BanknoteArrowDown:banknote-arrow-down,BanknoteArrowUp:banknote-arrow-up,BanknoteCheck:banknote-check,BanknoteX:banknote-x,Barcode:barcode,Barrel:barrel,Baseline:baseline,Bath:bath,Battery:battery,BatteryCharging:battery-charging,BatteryFull:battery-full,BatteryLow:battery-low,BatteryMedium:battery-medium,BatteryPlus:battery-plus,BatteryWarning:battery-warning,Beaker:beaker,Bean:bean,BeanOff:bean-off,Bed:bed,BedDouble:bed-double,BedSingle:bed-single,Beef:beef,BeefOff:beef-off,Beer:beer,BeerOff:beer-off,Bell:bell,BellCheck:bell-check,BellDot:bell-dot,BellElectric:bell-electric,BellMinus:bell-minus,BellOff:bell-off,BellPlus:bell-plus,BellRing:bell-ring,BetweenHorizontalEnd:between-horizontal-end,BetweenHorizontalStart:between-horizontal-start,BetweenVerticalEnd:between-vertical-end,BetweenVerticalStart:between-vertical-start,BicepsFlexed:biceps-flexed,Bike:bike,Binary:binary,Binoculars:binoculars,Biohazard:biohazard,Bird:bird,Birdhouse:birdhouse,Bitcoin:bitcoin,Blend:blend,Blender:blender,Blinds:blinds,Blocks:blocks,Bluetooth:bluetooth,BluetoothConnected:bluetooth-connected,BluetoothOff:bluetooth-off,BluetoothSearching:bluetooth-searching,Bold:bold,Bolt:bolt,Bomb:bomb,Bone:bone,BoneFracture:bone-fracture,Book:book,BookA:book-a,BookAlert:book-alert,BookAudio:book-audio,BookCheck:book-check,BookCopy:book-copy,BookDashed:book-dashed,BookDown:book-down,BookHeadphones:book-headphones,BookHeart:book-heart,BookImage:book-image,BookKey:book-key,BookLock:book-lock,BookMarked:book-marked,BookMinus:book-minus,BookOpen:book-open,BookOpenCheck:book-open-check,BookOpenText:book-open-text,BookPlus:book-plus,BookSearch:book-search,BookText:book-text,BookType:book-type,BookUp:book-up,BookUp2:book-up-2,BookUser:book-user,BookX:book-x,Bookmark:bookmark,BookmarkCheck:bookmark-check,BookmarkMinus:bookmark-minus,BookmarkOff:bookmark-off,BookmarkPlus:bookmark-plus,BookmarkX:bookmark-x,BoomBox:boom-box,Bot:bot,BotMessageSquare:bot-message-square,BotOff:bot-off,BottleWine:bottle-wine,BowArrow:bow-arrow,Box:box,Boxes:boxes,Braces:braces,Brackets:brackets,Brain:brain,BrainCircuit:brain-circuit,BrainCog:brain-cog,BrickWall:brick-wall,BrickWallFire:brick-wall-fire,BrickWallShield:brick-wall-shield,Bridge:bridge,Briefcase:briefcase,BriefcaseBusiness:briefcase-business,BriefcaseConveyorBelt:briefcase-conveyor-belt,BriefcaseMedical:briefcase-medical,BringToFront:bring-to-front,Broccoli:broccoli,Broom:broom,BroomSparkles:broom-sparkles,Brush:brush,BrushCleaning:brush-cleaning,Bubbles:bubbles,Bug:bug,BugOff:bug-off,BugPlay:bug-play,Building:building,Building2:building-2,Bus:bus,BusFront:bus-front,Cable:cable,CableCar:cable-car,Cake:cake,CakeSlice:cake-slice,Calculator:calculator,Calendar:calendar,Calendar1:calendar-1,CalendarArrowDown:calendar-arrow-down,CalendarArrowUp:calendar-arrow-up,CalendarCheck:calendar-check,CalendarCheck2:calendar-check-2,CalendarClock:calendar-clock,CalendarCog:calendar-cog,CalendarDays:calendar-days,CalendarFold:calendar-fold,CalendarHeart:calendar-heart,CalendarMinus:calendar-minus,CalendarMinus2:calendar-minus-2,CalendarOff:calendar-off,CalendarPlus:calendar-plus,CalendarPlus2:calendar-plus-2,CalendarRange:calendar-range,CalendarSearch:calendar-search,CalendarSync:calendar-sync,CalendarX:calendar-x,CalendarX2:calendar-x-2,Calendars:calendars,Camera:camera,CameraOff:camera-off,Can:can,CanSoda:can-soda,Candy:candy,CandyCane:candy-cane,CandyOff:candy-off,Cannabis:cannabis,CannabisOff:cannabis-off,Captions:captions,CaptionsOff:captions-off,Car:car,CarBattery:car-battery,CarFront:car-front,CarTaxiFront:car-taxi-front,Caravan:caravan,CardSim:card-sim,Carrot:carrot,Carton:carton,CartonOff:carton-off,CaseLower:case-lower,CaseSensitive:case-sensitive,CaseUpper:case-upper,CassetteTape:cassette-tape,Cast:cast,Castle:castle,Cat:cat,Cctv:cctv,CctvOff:cctv-off,ChartArea:chart-area,ChartBar:chart-bar,ChartBarBig:chart-bar-big,ChartBarDecreasing:chart-bar-decreasing,ChartBarIncreasing:chart-bar-increasing,ChartBarStacked:chart-bar-stacked,ChartCandlestick:chart-candlestick,ChartColumn:chart-column,ChartColumnBig:chart-column-big,ChartColumnDecreasing:chart-column-decreasing,ChartColumnIncreasing:chart-column-increasing,ChartColumnStacked:chart-column-stacked,ChartGantt:chart-gantt,ChartLine:chart-line,ChartNetwork:chart-network,ChartNoAxesColumn:chart-no-axes-column,ChartNoAxesColumnDecreasing:chart-no-axes-column-decreasing,ChartNoAxesColumnIncreasing:chart-no-axes-column-increasing,ChartNoAxesCombined:chart-no-axes-combined,ChartNoAxesGantt:chart-no-axes-gantt,ChartPie:chart-pie,ChartScatter:chart-scatter,ChartSpline:chart-spline,Check:check,CheckCheck:check-check,CheckLine:check-line,ChefHat:chef-hat,Cherry:cherry,ChessBishop:chess-bishop,ChessKing:chess-king,ChessKnight:chess-knight,ChessPawn:chess-pawn,ChessQueen:chess-queen,ChessRook:chess-rook,ChevronDown:chevron-down,ChevronFirst:chevron-first,ChevronLast:chevron-last,ChevronLeft:chevron-left,ChevronRight:chevron-right,ChevronUp:chevron-up,ChevronsDown:chevrons-down,ChevronsDownUp:chevrons-down-up,ChevronsLeft:chevrons-left,ChevronsLeftRight:chevrons-left-right,ChevronsLeftRightEllipsis:chevrons-left-right-ellipsis,ChevronsRight:chevrons-right,ChevronsRightLeft:chevrons-right-left,ChevronsUp:chevrons-up,ChevronsUpDown:chevrons-up-down,Church:church,Cigarette:cigarette,CigaretteOff:cigarette-off,Circle:circle,CircleAlert:circle-alert,CircleArrowDown:circle-arrow-down,CircleArrowLeft:circle-arrow-left,CircleArrowOutDownLeft:circle-arrow-out-down-left,CircleArrowOutDownRight:circle-arrow-out-down-right,CircleArrowOutUpLeft:circle-arrow-out-up-left,CircleArrowOutUpRight:circle-arrow-out-up-right,CircleArrowRight:circle-arrow-right,CircleArrowUp:circle-arrow-up,CircleCheck:circle-check,CircleCheckBig:circle-check-big,CircleChevronDown:circle-chevron-down,CircleChevronLeft:circle-chevron-left,CircleChevronRight:circle-chevron-right,CircleChevronUp:circle-chevron-up,CircleDashed:circle-dashed,CircleDashedCheck:circle-dashed-check,CircleDivide:circle-divide,CircleDollarSign:circle-dollar-sign,CircleDot:circle-dot,CircleDotDashed:circle-dot-dashed,CircleEllipsis:circle-ellipsis,CircleEqual:circle-equal,CircleEuro:circle-euro,CircleFadingArrowUp:circle-fading-arrow-up,CircleFadingPlus:circle-fading-plus,CircleGauge:circle-gauge,CircleMinus:circle-minus,CircleOff:circle-off,CircleParking:circle-parking,CircleParkingOff:circle-parking-off,CirclePause:circle-pause,CirclePercent:circle-percent,CirclePile:circle-pile,CirclePlay:circle-play,CirclePlus:circle-plus,CirclePoundSterling:circle-pound-sterling,CirclePower:circle-power,CircleQuestionMark:circle-question-mark,CircleSlash:circle-slash,CircleSlash2:circle-slash-2,CircleSmall:circle-small,CircleStar:circle-star,CircleStop:circle-stop,CircleUser:circle-user,CircleUserRound:circle-user-round,CircleX:circle-x,CircuitBoard:circuit-board,Citrus:citrus,Clapperboard:clapperboard,Clipboard:clipboard,ClipboardCheck:clipboard-check,ClipboardClock:clipboard-clock,ClipboardCopy:clipboard-copy,ClipboardList:clipboard-list,ClipboardMinus:clipboard-minus,ClipboardPaste:clipboard-paste,ClipboardPen:clipboard-pen,ClipboardPenLine:clipboard-pen-line,ClipboardPlus:clipboard-plus,ClipboardType:clipboard-type,ClipboardX:clipboard-x,Clock:clock,Clock1:clock-1,Clock10:clock-10,Clock11:clock-11,Clock12:clock-12,Clock2:clock-2,Clock3:clock-3,Clock4:clock-4,Clock5:clock-5,Clock6:clock-6,Clock7:clock-7,Clock8:clock-8,Clock9:clock-9,ClockAlert:clock-alert,ClockArrowDown:clock-arrow-down,ClockArrowLeft:clock-arrow-left,ClockArrowRight:clock-arrow-right,ClockArrowUp:clock-arrow-up,ClockCheck:clock-check,ClockFading:clock-fading,ClockPlus:clock-plus,ClosedCaption:closed-caption,Cloud:cloud,CloudAlert:cloud-alert,CloudBackup:cloud-backup,CloudCheck:cloud-check,CloudCog:cloud-cog,CloudDownload:cloud-download,CloudDrizzle:cloud-drizzle,CloudFog:cloud-fog,CloudHail:cloud-hail,CloudLightning:cloud-lightning,CloudMoon:cloud-moon,CloudMoonRain:cloud-moon-rain,CloudOff:cloud-off,CloudRain:cloud-rain,CloudRainWind:cloud-rain-wind,CloudSnow:cloud-snow,CloudSun:cloud-sun,CloudSunRain:cloud-sun-rain,CloudSync:cloud-sync,CloudUpload:cloud-upload,Cloudy:cloudy,Clover:clover,Club:club,Code:code,CodeXml:code-xml,Coffee:coffee,Cog:cog,Coins:coins,Columns2:columns-2,Columns3:columns-3,Columns3Cog:columns-3-cog,Columns4:columns-4,Combine:combine,Command:command,Compass:compass,Component:component,Computer:computer,ConciergeBell:concierge-bell,Cone:cone,Construction:construction,Contact:contact,ContactRound:contact-round,Container:container,Contrast:contrast,Cookie:cookie,CookingPot:cooking-pot,Copy:copy,CopyCheck:copy-check,CopyMinus:copy-minus,CopyPlus:copy-plus,CopySlash:copy-slash,CopyX:copy-x,Copyleft:copyleft,Copyright:copyright,CornerDownLeft:corner-down-left,CornerDownRight:corner-down-right,CornerLeftDown:corner-left-down,CornerLeftUp:corner-left-up,CornerRightDown:corner-right-down,CornerRightUp:corner-right-up,CornerUpLeft:corner-up-left,CornerUpRight:corner-up-right,Cpu:cpu,CreativeCommons:creative-commons,CreditCard:credit-card,CreditCardCheck:credit-card-check,CreditCardMinus:credit-card-minus,CreditCardPlus:credit-card-plus,CreditCardReader:credit-card-reader,CreditCardX:credit-card-x,Croissant:croissant,Crop:crop,Cross:cross,Crosshair:crosshair,Crown:crown,Cuboid:cuboid,CupSoda:cup-soda,Currency:currency,Cylinder:cylinder,Dam:dam,Database:database,DatabaseArrowDown:database-arrow-down,DatabaseArrowUp:database-arrow-up,DatabaseBackup:database-backup,DatabaseCheck:database-check,DatabaseMinus:database-minus,DatabasePlus:database-plus,DatabaseSearch:database-search,DatabaseX:database-x,DatabaseZap:database-zap,DecimalsArrowLeft:decimals-arrow-left,DecimalsArrowRight:decimals-arrow-right,Delete:delete,Dessert:dessert,Diameter:diameter,Diamond:diamond,DiamondMinus:diamond-minus,DiamondPercent:diamond-percent,DiamondPlus:diamond-plus,Dice1:dice-1,Dice2:dice-2,Dice3:dice-3,Dice4:dice-4,Dice5:dice-5,Dice6:dice-6,Dices:dices,Diff:diff,Disc:disc,Disc2:disc-2,Disc3:disc-3,DiscAlbum:disc-album,Divide:divide,Dna:dna,DnaOff:dna-off,Dock:dock,Dog:dog,DollarSign:dollar-sign,Dome:dome,Donut:donut,DoorClosed:door-closed,DoorClosedLocked:door-closed-locked,DoorOpen:door-open,DoorStairwell:door-stairwell,Dot:dot,Download:download,DraftingCompass:drafting-compass,Drama:drama,Drill:drill,Drone:drone,Droplet:droplet,DropletOff:droplet-off,Droplets:droplets,Drum:drum,Drumstick:drumstick,Dumbbell:dumbbell,Ear:ear,EarOff:ear-off,Earth:earth,EarthLock:earth-lock,Eclipse:eclipse,Egg:egg,EggFried:egg-fried,EggOff:egg-off,Eject:eject,Ellipse:ellipse,Ellipsis:ellipsis,EllipsisVertical:ellipsis-vertical,Engine:engine,Equal:equal,EqualApproximately:equal-approximately,EqualApproximatelyNot:equal-approximately-not,EqualNot:equal-not,Eraser:eraser,EthernetPort:ethernet-port,Euro:euro,EvCharger:ev-charger,Expand:expand,ExternalLink:external-link,Eye:eye,EyeClosed:eye-closed,EyeDashed:eye-dashed,EyeOff:eye-off,FaceAngry:face-angry,FaceExpressionless:face-expressionless,FaceGrinning:face-grinning,FaceNeutral:face-neutral,FaceSlightlyFrowning:face-slightly-frowning,FaceSlightlySmiling:face-slightly-smiling,FaceSlightlySmilingPlus:face-slightly-smiling-plus,Factory:factory,Fan:fan,FastForward:fast-forward,Feather:feather,Fence:fence,FerrisWheel:ferris-wheel,File:file,FileArchive:file-archive,FileAxis3d:file-axis-3d,FileBadge:file-badge,FileBox:file-box,FileBraces:file-braces,FileBracesCorner:file-braces-corner,FileChartColumn:file-chart-column,FileChartColumnIncreasing:file-chart-column-increasing,FileChartLine:file-chart-line,FileChartPie:file-chart-pie,FileCheck:file-check,FileCheckCorner:file-check-corner,FileClock:file-clock,FileCode:file-code,FileCodeCorner:file-code-corner,FileCog:file-cog,FileDiff:file-diff,FileDigit:file-digit,FileDown:file-down,FileExclamationPoint:file-exclamation-point,FileHeadphone:file-headphone,FileHeart:file-heart,FileImage:file-image,FileInput:file-input,FileKey:file-key,FileLock:file-lock,FileMinus:file-minus,FileMinusCorner:file-minus-corner,FileMusic:file-music,FileOutput:file-output,FilePen:file-pen,FilePenLine:file-pen-line,FilePlay:file-play,FilePlus:file-plus,FilePlusCorner:file-plus-corner,FileQuestionMark:file-question-mark,FileScan:file-scan,FileSearch:file-search,FileSearchCorner:file-search-corner,FileSignal:file-signal,FileSliders:file-sliders,FileSpreadsheet:file-spreadsheet,FileStack:file-stack,FileSymlink:file-symlink,FileTerminal:file-terminal,FileText:file-text,FileType:file-type,FileTypeCorner:file-type-corner,FileUp:file-up,FileUser:file-user,FileVideoCamera:file-video-camera,FileVolume:file-volume,FileX:file-x,FileXCorner:file-x-corner,Files:files,Film:film,FingerprintPattern:fingerprint-pattern,FireExtinguisher:fire-extinguisher,Fish:fish,FishOff:fish-off,FishSymbol:fish-symbol,FishingHook:fishing-hook,FishingRod:fishing-rod,Flag:flag,FlagOff:flag-off,FlagTriangleLeft:flag-triangle-left,FlagTriangleRight:flag-triangle-right,Flame:flame,FlameKindling:flame-kindling,Flashlight:flashlight,FlashlightOff:flashlight-off,FlaskConical:flask-conical,FlaskConicalOff:flask-conical-off,FlaskRound:flask-round,FlipHorizontal2:flip-horizontal-2,FlipVertical2:flip-vertical-2,Flower:flower,Flower2:flower-2,Focus:focus,FoldHorizontal:fold-horizontal,FoldVertical:fold-vertical,Folder:folder,FolderArchive:folder-archive,FolderBookmark:folder-bookmark,FolderCheck:folder-check,FolderClock:folder-clock,FolderClosed:folder-closed,FolderCode:folder-code,FolderCog:folder-cog,FolderDot:folder-dot,FolderDown:folder-down,FolderGit:folder-git,FolderGit2:folder-git-2,FolderHeart:folder-heart,FolderInput:folder-input,FolderKanban:folder-kanban,FolderKey:folder-key,FolderLock:folder-lock,FolderMinus:folder-minus,FolderOpen:folder-open,FolderOpenDot:folder-open-dot,FolderOutput:folder-output,FolderPen:folder-pen,FolderPlus:folder-plus,FolderRoot:folder-root,FolderSearch:folder-search,FolderSearch2:folder-search-2,FolderSymlink:folder-symlink,FolderSync:folder-sync,FolderTree:folder-tree,FolderUp:folder-up,FolderX:folder-x,Folders:folders,Footprints:footprints,Forklift:forklift,Form:form,Forward:forward,Frame:frame,Fuel:fuel,Fullscreen:fullscreen,Funnel:funnel,FunnelPlus:funnel-plus,FunnelX:funnel-x,Galaxy:galaxy,GalleryHorizontal:gallery-horizontal,GalleryHorizontalEnd:gallery-horizontal-end,GalleryThumbnails:gallery-thumbnails,GalleryVertical:gallery-vertical,GalleryVerticalEnd:gallery-vertical-end,Gamepad:gamepad,Gamepad2:gamepad-2,GamepadDirectional:gamepad-directional,GapHorizontal:gap-horizontal,GapVertical:gap-vertical,Gauge:gauge,Gavel:gavel,Gem:gem,GeorgianLari:georgian-lari,Germ:germ,GermOff:germ-off,Ghost:ghost,Gift:gift,GitBranch:git-branch,GitBranchMinus:git-branch-minus,GitBranchPlus:git-branch-plus,GitCommitHorizontal:git-commit-horizontal,GitCommitVertical:git-commit-vertical,GitCompare:git-compare,GitCompareArrows:git-compare-arrows,GitFork:git-fork,GitGraph:git-graph,GitMerge:git-merge,GitMergeConflict:git-merge-conflict,GitPullRequest:git-pull-request,GitPullRequestArrow:git-pull-request-arrow,GitPullRequestClosed:git-pull-request-closed,GitPullRequestCreate:git-pull-request-create,GitPullRequestCreateArrow:git-pull-request-create-arrow,GitPullRequestDraft:git-pull-request-draft,GlassWater:glass-water,Glasses:glasses,Globe:globe,GlobeCheck:globe-check,GlobeLock:globe-lock,GlobeOff:globe-off,GlobeX:globe-x,Goal:goal,Gpu:gpu,GraduationCap:graduation-cap,Grape:grape,Grid2x2:grid-2x2,Grid2x2Check:grid-2x2-check,Grid2x2Plus:grid-2x2-plus,Grid2x2X:grid-2x2-x,Grid3x2:grid-3x2,Grid3x3:grid-3x3,Grip:grip,GripHorizontal:grip-horizontal,GripVertical:grip-vertical,Group:group,Guitar:guitar,Ham:ham,Hamburger:hamburger,Hammer:hammer,Hand:hand,HandCoins:hand-coins,HandFist:hand-fist,HandGrab:hand-grab,HandHeart:hand-heart,HandHelping:hand-helping,HandMetal:hand-metal,HandPlatter:hand-platter,Handbag:handbag,Handshake:handshake,HardDrive:hard-drive,HardDriveDownload:hard-drive-download,HardDriveUpload:hard-drive-upload,HardHat:hard-hat,Hash:hash,HatGlasses:hat-glasses,Haze:haze,Hd:hd,HdmiPort:hdmi-port,Heading:heading,Heading1:heading-1,Heading2:heading-2,Heading3:heading-3,Heading4:heading-4,Heading5:heading-5,Heading6:heading-6,HeadphoneOff:headphone-off,Headphones:headphones,Headset:headset,Heart:heart,HeartCrack:heart-crack,HeartHandshake:heart-handshake,HeartMinus:heart-minus,HeartOff:heart-off,HeartPlus:heart-plus,HeartPulse:heart-pulse,HeartX:heart-x,Heater:heater,Helicopter:helicopter,Hexagon:hexagon,Highlighter:highlighter,Hop:hop,HopOff:hop-off,Hospital:hospital,Hotel:hotel,Hourglass:hourglass,House:house,HouseHeart:house-heart,HousePlug:house-plug,HousePlus:house-plus,HouseWifi:house-wifi,IceCreamBowl:ice-cream-bowl,IceCreamCone:ice-cream-cone,IdCard:id-card,IdCardLanyard:id-card-lanyard,Image:image,ImageDown:image-down,ImageMinus:image-minus,ImageOff:image-off,ImagePlay:image-play,ImagePlus:image-plus,ImageUp:image-up,ImageUpscale:image-upscale,Images:images,Import:import,Inbox:inbox,IndianRupee:indian-rupee,Infinity:infinity,Info:info,InspectionPanel:inspection-panel,Italic:italic,IterationCcw:iteration-ccw,IterationCw:iteration-cw,JapaneseYen:japanese-yen,Joystick:joystick,Kanban:kanban,Kayak:kayak,Key:key,KeyRound:key-round,KeySquare:key-square,Keyboard:keyboard,KeyboardMusic:keyboard-music,KeyboardOff:keyboard-off,Lamp:lamp,LampCeiling:lamp-ceiling,LampDesk:lamp-desk,LampFloor:lamp-floor,LampWallDown:lamp-wall-down,LampWallUp:lamp-wall-up,LandPlot:land-plot,Landmark:landmark,Languages:languages,Laptop:laptop,LaptopMinimal:laptop-minimal,LaptopMinimalCheck:laptop-minimal-check,Lasso:lasso,LassoSelect:lasso-select,LayerArrowDown:layer-arrow-down,LayerArrowUp:layer-arrow-up,Layers:layers,Layers2:layers-2,LayersArrowDown:layers-arrow-down,LayersArrowUp:layers-arrow-up,LayersMinus:layers-minus,LayersPlus:layers-plus,LayoutDashboard:layout-dashboard,LayoutFreeform:layout-freeform,LayoutGrid:layout-grid,LayoutList:layout-list,LayoutPanelLeft:layout-panel-left,LayoutPanelTop:layout-panel-top,LayoutTemplate:layout-template,Leaf:leaf,LeafyGreen:leafy-green,Lectern:lectern,LensConcave:lens-concave,LensConvex:lens-convex,Library:library,LibraryBig:library-big,LifeBuoy:life-buoy,Ligature:ligature,Lightbulb:lightbulb,LightbulbOff:lightbulb-off,Lighthouse:lighthouse,LineDotRightHorizontal:line-dot-right-horizontal,LineSquiggle:line-squiggle,LineStyle:line-style,Link:link,Link2:link-2,Link2Off:link-2-off,List:list,ListCheck:list-check,ListChecks:list-checks,ListChevronsDownUp:list-chevrons-down-up,ListChevronsUpDown:list-chevrons-up-down,ListClock:list-clock,ListCollapse:list-collapse,ListEnd:list-end,ListFilter:list-filter,ListFilterPlus:list-filter-plus,ListIndentDecrease:list-indent-decrease,ListIndentIncrease:list-indent-increase,ListMinus:list-minus,ListMusic:list-music,ListOrdered:list-ordered,ListPlus:list-plus,ListRestart:list-restart,ListSortAscending:list-sort-ascending,ListSortDescending:list-sort-descending,ListStart:list-start,ListTodo:list-todo,ListTree:list-tree,ListVideo:list-video,ListX:list-x,Loader:loader,LoaderCircle:loader-circle,LoaderPinwheel:loader-pinwheel,Locate:locate,LocateFixed:locate-fixed,LocateOff:locate-off,Lock:lock,LockKeyhole:lock-keyhole,LockKeyholeOpen:lock-keyhole-open,LockOpen:lock-open,LogIn:log-in,LogOut:log-out,Logs:logs,Lollipop:lollipop,Luggage:luggage,Magnet:magnet,Mail:mail,MailBadge:mail-badge,MailCheck:mail-check,MailClock:mail-clock,MailMinus:mail-minus,MailOpen:mail-open,MailPen:mail-pen,MailPlus:mail-plus,MailQuestionMark:mail-question-mark,MailSearch:mail-search,MailWarning:mail-warning,MailX:mail-x,Mailbox:mailbox,Mails:mails,Map:map,MapMinus:map-minus,MapPin:map-pin,MapPinCheck:map-pin-check,MapPinCheckInside:map-pin-check-inside,MapPinHouse:map-pin-house,MapPinMinus:map-pin-minus,MapPinMinusInside:map-pin-minus-inside,MapPinOff:map-pin-off,MapPinPen:map-pin-pen,MapPinPlus:map-pin-plus,MapPinPlusInside:map-pin-plus-inside,MapPinSearch:map-pin-search,MapPinX:map-pin-x,MapPinXInside:map-pin-x-inside,MapPinned:map-pinned,MapPlus:map-plus,Mars:mars,MarsStroke:mars-stroke,Martini:martini,Maximize:maximize,Maximize2:maximize-2,Medal:medal,Megaphone:megaphone,MegaphoneOff:megaphone-off,MemoryStick:memory-stick,Menu:menu,Merge:merge,MessageCircle:message-circle,MessageCircleCheck:message-circle-check,MessageCircleCode:message-circle-code,MessageCircleDashed:message-circle-dashed,MessageCircleDashedCheck:message-circle-dashed-check,MessageCircleHeart:message-circle-heart,MessageCircleMore:message-circle-more,MessageCircleOff:message-circle-off,MessageCirclePlus:message-circle-plus,MessageCircleQuestionMark:message-circle-question-mark,MessageCircleReply:message-circle-reply,MessageCircleWarning:message-circle-warning,MessageCircleX:message-circle-x,MessageSquare:message-square,MessageSquareCheck:message-square-check,MessageSquareCode:message-square-code,MessageSquareDashed:message-square-dashed,MessageSquareDiff:message-square-diff,MessageSquareDot:message-square-dot,MessageSquareHeart:message-square-heart,MessageSquareLock:message-square-lock,MessageSquareMore:message-square-more,MessageSquareOff:message-square-off,MessageSquarePlus:message-square-plus,MessageSquareQuote:message-square-quote,MessageSquareReply:message-square-reply,MessageSquareShare:message-square-share,MessageSquareText:message-square-text,MessageSquareWarning:message-square-warning,MessageSquareX:message-square-x,MessagesSquare:messages-square,Metronome:metronome,Mic:mic,MicAudioLines:mic-audio-lines,MicOff:mic-off,MicSignal:mic-signal,MicVocal:mic-vocal,Microchip:microchip,Microscope:microscope,Microwave:microwave,MidiPort:midi-port,Milestone:milestone,Milk:milk,MilkOff:milk-off,Minimize:minimize,Minimize2:minimize-2,Minus:minus,MirrorRectangular:mirror-rectangular,MirrorRound:mirror-round,Monitor:monitor,MonitorCheck:monitor-check,MonitorCloud:monitor-cloud,MonitorCog:monitor-cog,MonitorDot:monitor-dot,MonitorDown:monitor-down,MonitorOff:monitor-off,MonitorPause:monitor-pause,MonitorPlay:monitor-play,MonitorSmartphone:monitor-smartphone,MonitorSpeaker:monitor-speaker,MonitorStop:monitor-stop,MonitorUp:monitor-up,MonitorX:monitor-x,Moon:moon,MoonStar:moon-star,Mop:mop,MopSparkles:mop-sparkles,Mosque:mosque,Motorbike:motorbike,Mountain:mountain,MountainSnow:mountain-snow,Mouse:mouse,MouseLeft:mouse-left,MouseOff:mouse-off,MousePointer:mouse-pointer,MousePointer2:mouse-pointer-2,MousePointer2Off:mouse-pointer-2-off,MousePointerBan:mouse-pointer-ban,MousePointerClick:mouse-pointer-click,MouseRight:mouse-right,Move:move,Move3d:move-3d,MoveDiagonal:move-diagonal,MoveDiagonal2:move-diagonal-2,MoveDown:move-down,MoveDownLeft:move-down-left,MoveDownRight:move-down-right,MoveHorizontal:move-horizontal,MoveLeft:move-left,MoveRight:move-right,MoveUp:move-up,MoveUpLeft:move-up-left,MoveUpRight:move-up-right,MoveVertical:move-vertical,Music:music,Music2:music-2,Music3:music-3,Music4:music-4,Navigation:navigation,Navigation2:navigation-2,Navigation2Off:navigation-2-off,NavigationOff:navigation-off,Network:network,Newspaper:newspaper,Nfc:nfc,NonBinary:non-binary,Notebook:notebook,NotebookPen:notebook-pen,NotebookTabs:notebook-tabs,NotebookText:notebook-text,NotepadText:notepad-text,NotepadTextDashed:notepad-text-dashed,Nut:nut,NutOff:nut-off,Octagon:octagon,OctagonAlert:octagon-alert,OctagonMinus:octagon-minus,OctagonPause:octagon-pause,OctagonX:octagon-x,Omega:omega,Option:option,Orbit:orbit,Origami:origami,Package:package,Package2:package-2,PackageCheck:package-check,PackageMinus:package-minus,PackageOpen:package-open,PackagePlus:package-plus,PackageSearch:package-search,PackageX:package-x,PaintBucket:paint-bucket,PaintRoller:paint-roller,Paintbrush:paintbrush,PaintbrushVertical:paintbrush-vertical,Palette:palette,Panda:panda,PanelBottom:panel-bottom,PanelBottomClose:panel-bottom-close,PanelBottomDashed:panel-bottom-dashed,PanelBottomOpen:panel-bottom-open,PanelLeft:panel-left,PanelLeftClose:panel-left-close,PanelLeftDashed:panel-left-dashed,PanelLeftOpen:panel-left-open,PanelLeftRightDashed:panel-left-right-dashed,PanelRight:panel-right,PanelRightClose:panel-right-close,PanelRightDashed:panel-right-dashed,PanelRightOpen:panel-right-open,PanelTop:panel-top,PanelTopBottomDashed:panel-top-bottom-dashed,PanelTopClose:panel-top-close,PanelTopDashed:panel-top-dashed,PanelTopOpen:panel-top-open,PanelsLeftBottom:panels-left-bottom,PanelsRightBottom:panels-right-bottom,PanelsTopLeft:panels-top-left,PaperBag:paper-bag,Paperclip:paperclip,Parasol:parasol,Parentheses:parentheses,ParkingMeter:parking-meter,PartyPopper:party-popper,Pause:pause,PawPrint:paw-print,PcCase:pc-case,Pen:pen,PenLine:pen-line,PenOff:pen-off,PenTool:pen-tool,Pencil:pencil,PencilLine:pencil-line,PencilOff:pencil-off,PencilRuler:pencil-ruler,PencilSparkles:pencil-sparkles,Pentagon:pentagon,Percent:percent,PersonStanding:person-standing,Phi:phi,PhilippinePeso:philippine-peso,Phone:phone,PhoneCall:phone-call,PhoneForwarded:phone-forwarded,PhoneIncoming:phone-incoming,PhoneMissed:phone-missed,PhoneOff:phone-off,PhoneOutgoing:phone-outgoing,Pi:pi,Piano:piano,Pickaxe:pickaxe,PictureInPicture:picture-in-picture,PictureInPicture2:picture-in-picture-2,PiggyBank:piggy-bank,Pilcrow:pilcrow,PilcrowLeft:pilcrow-left,PilcrowRight:pilcrow-right,Pill:pill,PillBottle:pill-bottle,Pin:pin,PinOff:pin-off,Pipette:pipette,Pizza:pizza,Plane:plane,PlaneLanding:plane-landing,PlaneTakeoff:plane-takeoff,Play:play,PlayOff:play-off,PlayingCard:playing-card,PlayingCards:playing-cards,PlayingCardsFan:playing-cards-fan,Plug:plug,Plug2:plug-2,PlugZap:plug-zap,Plus:plus,PocketKnife:pocket-knife,Podium:podium,Pointer:pointer,PointerOff:pointer-off,Popcorn:popcorn,Popsicle:popsicle,PoundSterling:pound-sterling,Power:power,PowerOff:power-off,Presentation:presentation,Printer:printer,PrinterCheck:printer-check,PrinterX:printer-x,Projector:projector,Proportions:proportions,Puzzle:puzzle,Pyramid:pyramid,QrCode:qr-code,Quote:quote,Rabbit:rabbit,Radar:radar,Radiation:radiation,Radical:radical,Radio:radio,RadioOff:radio-off,RadioReceiver:radio-receiver,RadioTower:radio-tower,Radius:radius,Rainbow:rainbow,Rat:rat,Ratio:ratio,Receipt:receipt,ReceiptCent:receipt-cent,ReceiptEuro:receipt-euro,ReceiptIndianRupee:receipt-indian-rupee,ReceiptJapaneseYen:receipt-japanese-yen,ReceiptPoundSterling:receipt-pound-sterling,ReceiptRussianRuble:receipt-russian-ruble,ReceiptSwissFranc:receipt-swiss-franc,ReceiptText:receipt-text,ReceiptTurkishLira:receipt-turkish-lira,RectangleCircle:rectangle-circle,RectangleEllipsis:rectangle-ellipsis,RectangleGoggles:rectangle-goggles,RectangleHorizontal:rectangle-horizontal,RectangleVertical:rectangle-vertical,Recycle:recycle,Redo:redo,Redo2:redo-2,RedoDot:redo-dot,RefreshCcw:refresh-ccw,RefreshCcwDot:refresh-ccw-dot,RefreshCw:refresh-cw,RefreshCwOff:refresh-cw-off,Refrigerator:refrigerator,Regex:regex,RemoveFormatting:remove-formatting,Repeat:repeat,Repeat1:repeat-1,Repeat2:repeat-2,RepeatOff:repeat-off,Replace:replace,ReplaceAll:replace-all,Reply:reply,ReplyAll:reply-all,Rewind:rewind,Ribbon:ribbon,Road:road,RobotArm:robot-arm,RobotVacuum:robot-vacuum,Rocket:rocket,RockingChair:rocking-chair,RollerCoaster:roller-coaster,Rose:rose,Rotate3d:rotate-3d,RotateCcw:rotate-ccw,RotateCcwClock:rotate-ccw-clock,RotateCcwKey:rotate-ccw-key,RotateCcwSquare:rotate-ccw-square,RotateCw:rotate-cw,RotateCwFadingClock:rotate-cw-fading-clock,RotateCwSquare:rotate-cw-square,Route:route,RouteOff:route-off,Router:router,Rows2:rows-2,Rows3:rows-3,Rows4:rows-4,Rss:rss,Ruler:ruler,RulerDimensionLine:ruler-dimension-line,RussianRuble:russian-ruble,Sailboat:sailboat,Salad:salad,Sandwich:sandwich,Satellite:satellite,SatelliteDish:satellite-dish,SaudiRiyal:saudi-riyal,Save:save,SaveAll:save-all,SaveCheck:save-check,SaveOff:save-off,SavePen:save-pen,SavePlus:save-plus,Scale:scale,Scale3d:scale-3d,Scaling:scaling,Scan:scan,ScanBarcode:scan-barcode,ScanBox:scan-box,ScanEye:scan-eye,ScanFace:scan-face,ScanHeart:scan-heart,ScanLine:scan-line,ScanQrCode:scan-qr-code,ScanSearch:scan-search,ScanSquare:scan-square,ScanText:scan-text,School:school,Scissors:scissors,ScissorsLineDashed:scissors-line-dashed,Scooter:scooter,ScreenShare:screen-share,ScreenShareOff:screen-share-off,Scroll:scroll,ScrollText:scroll-text,Search:search,SearchAlert:search-alert,SearchCheck:search-check,SearchCode:search-code,SearchSlash:search-slash,SearchX:search-x,Section:section,Send:send,SendHorizontal:send-horizontal,SendToBack:send-to-back,SeparatorHorizontal:separator-horizontal,SeparatorVertical:separator-vertical,Server:server,ServerCog:server-cog,ServerCrash:server-crash,ServerOff:server-off,ServerPlus:server-plus,Settings:settings,Settings2:settings-2,Shapes:shapes,Share:share,Share2:share-2,Sheet:sheet,Shell:shell,ShelvingUnit:shelving-unit,Shield:shield,ShieldAlert:shield-alert,ShieldBan:shield-ban,ShieldCheck:shield-check,ShieldCog:shield-cog,ShieldCogCorner:shield-cog-corner,ShieldEllipsis:shield-ellipsis,ShieldHalf:shield-half,ShieldKeyhole:shield-keyhole,ShieldLock:shield-lock,ShieldMinus:shield-minus,ShieldOff:shield-off,ShieldPlus:shield-plus,ShieldQuestionMark:shield-question-mark,ShieldUser:shield-user,ShieldX:shield-x,Ship:ship,ShipCargo:ship-cargo,ShipWheel:ship-wheel,Shirt:shirt,ShoppingBag:shopping-bag,ShoppingBasket:shopping-basket,ShoppingCart:shopping-cart,ShoppingCartMinus:shopping-cart-minus,ShoppingCartPlus:shopping-cart-plus,Shovel:shovel,ShowerHead:shower-head,Shredder:shredder,Shrimp:shrimp,ShrimpOff:shrimp-off,Shrink:shrink,Shrub:shrub,Shuffle:shuffle,Sigma:sigma,Signal:signal,SignalHigh:signal-high,SignalLow:signal-low,SignalMedium:signal-medium,SignalZero:signal-zero,Signature:signature,Signpost:signpost,SignpostBig:signpost-big,Siren:siren,SkipBack:skip-back,SkipForward:skip-forward,Skull:skull,Slash:slash,Slice:slice,SlidersHorizontal:sliders-horizontal,SlidersVertical:sliders-vertical,Smartphone:smartphone,SmartphoneCharging:smartphone-charging,SmartphoneNfc:smartphone-nfc,Snail:snail,Snowflake:snowflake,SoapDispenserDroplet:soap-dispenser-droplet,Sofa:sofa,SolarPanel:solar-panel,Soup:soup,Space:space,Spade:spade,Sparkle:sparkle,Sparkles:sparkles,Speaker:speaker,Speech:speech,SpellCheck:spell-check,SpellCheck2:spell-check-2,Spline:spline,SplinePointer:spline-pointer,Split:split,Spool:spool,SportShoe:sport-shoe,Spotlight:spotlight,SprayCan:spray-can,Sprout:sprout,Square:square,SquareActivity:square-activity,SquareArrowDown:square-arrow-down,SquareArrowDownLeft:square-arrow-down-left,SquareArrowDownRight:square-arrow-down-right,SquareArrowLeft:square-arrow-left,SquareArrowOutDownLeft:square-arrow-out-down-left,SquareArrowOutDownRight:square-arrow-out-down-right,SquareArrowOutUpLeft:square-arrow-out-up-left,SquareArrowOutUpRight:square-arrow-out-up-right,SquareArrowRight:square-arrow-right,SquareArrowRightEnter:square-arrow-right-enter,SquareArrowRightExit:square-arrow-right-exit,SquareArrowUp:square-arrow-up,SquareArrowUpLeft:square-arrow-up-left,SquareArrowUpRight:square-arrow-up-right,SquareAsterisk:square-asterisk,SquareBottomDashedScissors:square-bottom-dashed-scissors,SquareCenterlineDashedHorizontal:square-centerline-dashed-horizontal,SquareCenterlineDashedVertical:square-centerline-dashed-vertical,SquareChartGantt:square-chart-gantt,SquareCheck:square-check,SquareCheckBig:square-check-big,SquareChevronDown:square-chevron-down,SquareChevronLeft:square-chevron-left,SquareChevronRight:square-chevron-right,SquareChevronUp:square-chevron-up,SquareCode:square-code,SquareDashed:square-dashed,SquareDashedBottom:square-dashed-bottom,SquareDashedBottomCode:square-dashed-bottom-code,SquareDashedKanban:square-dashed-kanban,SquareDashedMousePointer:square-dashed-mouse-pointer,SquareDashedText:square-dashed-text,SquareDashedTopSolid:square-dashed-top-solid,SquareDimensions:square-dimensions,SquareDivide:square-divide,SquareDot:square-dot,SquareEqual:square-equal,SquareExclamationPoint:square-exclamation-point,SquareFunction:square-function,SquareKanban:square-kanban,SquareLibrary:square-library,SquareM:square-m,SquareMenu:square-menu,SquareMinus:square-minus,SquareMousePointer:square-mouse-pointer,SquareOff:square-off,SquareParking:square-parking,SquareParkingOff:square-parking-off,SquarePause:square-pause,SquarePen:square-pen,SquarePercent:square-percent,SquarePi:square-pi,SquarePilcrow:square-pilcrow,SquarePlay:square-play,SquarePlus:square-plus,SquarePower:square-power,SquareRadical:square-radical,SquareRoundCorner:square-round-corner,SquareScissors:square-scissors,SquareSigma:square-sigma,SquareSlash:square-slash,SquareSplitHorizontal:square-split-horizontal,SquareSplitVertical:square-split-vertical,SquareSquare:square-square,SquareStack:square-stack,SquareStar:square-star,SquareStop:square-stop,SquareTerminal:square-terminal,SquareText:square-text,SquareUser:square-user,SquareUserRound:square-user-round,SquareX:square-x,SquaresExclude:squares-exclude,SquaresIntersect:squares-intersect,SquaresSubtract:squares-subtract,SquaresUnite:squares-unite,Squircle:squircle,SquircleDashed:squircle-dashed,Squirrel:squirrel,Stamp:stamp,Star:star,StarCheck:star-check,StarHalf:star-half,StarMinus:star-minus,StarOff:star-off,StarPlus:star-plus,StarX:star-x,StepBack:step-back,StepForward:step-forward,Stethoscope:stethoscope,Sticker:sticker,StickyNote:sticky-note,StickyNoteCheck:sticky-note-check,StickyNoteMinus:sticky-note-minus,StickyNoteOff:sticky-note-off,StickyNotePlus:sticky-note-plus,StickyNoteX:sticky-note-x,StickyNotes:sticky-notes,Stone:stone,Store:store,StretchHorizontal:stretch-horizontal,StretchVertical:stretch-vertical,Strikethrough:strikethrough,Subscript:subscript,Summary:summary,Sun:sun,SunDim:sun-dim,SunMedium:sun-medium,SunMoon:sun-moon,SunSnow:sun-snow,Sunrise:sunrise,Sunset:sunset,Superscript:superscript,SwatchBook:swatch-book,SwissFranc:swiss-franc,SwitchCamera:switch-camera,Sword:sword,Swords:swords,Syringe:syringe,Table:table,Table2:table-2,TableCellsMerge:table-cells-merge,TableCellsSplit:table-cells-split,TableColumnsSplit:table-columns-split,TableOfContents:table-of-contents,TableProperties:table-properties,TableRowsSplit:table-rows-split,Tablet:tablet,TabletSmartphone:tablet-smartphone,Tablets:tablets,Tag:tag,TagPlus:tag-plus,TagX:tag-x,Tags:tags,Tally1:tally-1,Tally2:tally-2,Tally3:tally-3,Tally4:tally-4,Tally5:tally-5,Tangent:tangent,Target:target,Telescope:telescope,Tent:tent,TentTree:tent-tree,Terminal:terminal,TestTube:test-tube,TestTubeDiagonal:test-tube-diagonal,TestTubes:test-tubes,TextAlignCenter:text-align-center,TextAlignEnd:text-align-end,TextAlignJustify:text-align-justify,TextAlignStart:text-align-start,TextCursor:text-cursor,TextCursorInput:text-cursor-input,TextInitial:text-initial,TextQuote:text-quote,TextSearch:text-search,TextWrap:text-wrap,Theater:theater,Thermometer:thermometer,ThermometerSnowflake:thermometer-snowflake,ThermometerSun:thermometer-sun,ThumbsDown:thumbs-down,ThumbsUp:thumbs-up,TicTacToe:tic-tac-toe,Ticket:ticket,TicketCheck:ticket-check,TicketMinus:ticket-minus,TicketPercent:ticket-percent,TicketPlus:ticket-plus,TicketSlash:ticket-slash,TicketX:ticket-x,Tickets:tickets,TicketsPlane:tickets-plane,Timeline:timeline,Timer:timer,TimerOff:timer-off,TimerReset:timer-reset,ToggleLeft:toggle-left,ToggleRight:toggle-right,Toilet:toilet,ToolCase:tool-case,Toolbox:toolbox,Tornado:tornado,Torus:torus,Touchpad:touchpad,TouchpadOff:touchpad-off,TowelRack:towel-rack,TowerControl:tower-control,ToyBrick:toy-brick,Tractor:tractor,TrafficCone:traffic-cone,Trailer:trailer,TrainFront:train-front,TrainFrontTunnel:train-front-tunnel,TrainTrack:train-track,TramFront:tram-front,Transgender:transgender,Trash:trash,TrashOff:trash-off,TreeDeciduous:tree-deciduous,TreePalm:tree-palm,TreePine:tree-pine,Trees:trees,TrendingDown:trending-down,TrendingUp:trending-up,TrendingUpDown:trending-up-down,Triangle:triangle,TriangleAlert:triangle-alert,TriangleDashed:triangle-dashed,TriangleRight:triangle-right,Trophy:trophy,Truck:truck,TruckElectric:truck-electric,TurkishLira:turkish-lira,Turntable:turntable,Turtle:turtle,Tv:tv,TvMinimal:tv-minimal,TvMinimalPlay:tv-minimal-play,Type:type,TypeOutline:type-outline,Umbrella:umbrella,UmbrellaOff:umbrella-off,Underline:underline,Undo:undo,Undo2:undo-2,UndoDot:undo-dot,UnfoldHorizontal:unfold-horizontal,UnfoldVertical:unfold-vertical,Ungroup:ungroup,University:university,Unlink:unlink,Unlink2:unlink-2,Unplug:unplug,Upload:upload,Usb:usb,UsbCPort:usb-c-port,User:user,UserCheck:user-check,UserCog:user-cog,UserGroup:user-group,UserKey:user-key,UserLock:user-lock,UserMinus:user-minus,UserPen:user-pen,UserPlus:user-plus,UserRound:user-round,UserRoundArrowLeft:user-round-arrow-left,UserRoundCheck:user-round-check,UserRoundCog:user-round-cog,UserRoundGroup:user-round-group,UserRoundKey:user-round-key,UserRoundMinus:user-round-minus,UserRoundPen:user-round-pen,UserRoundPlus:user-round-plus,UserRoundSearch:user-round-search,UserRoundX:user-round-x,UserSearch:user-search,UserShield:user-shield,UserStar:user-star,UserX:user-x,Users:users,UsersRound:users-round,Utensils:utensils,UtensilsCrossed:utensils-crossed,UtilityPole:utility-pole,Van:van,Variable:variable,Vault:vault,VectorPolygon:vector-polygon,VectorSquare:vector-square,Vegan:vegan,VenetianMask:venetian-mask,Venus:venus,VenusAndMars:venus-and-mars,Vibrate:vibrate,VibrateOff:vibrate-off,Video:video,VideoOff:video-off,Videotape:videotape,View:view,Virus:virus,VirusOff:virus-off,Voicemail:voicemail,Volleyball:volleyball,Volume:volume,Volume1:volume-1,Volume2:volume-2,VolumeOff:volume-off,VolumeX:volume-x,Vote:vote,Wallet:wallet,WalletCards:wallet-cards,WalletMinimal:wallet-minimal,Wallpaper:wallpaper,Wand:wand,WandSparkles:wand-sparkles,Warehouse:warehouse,WashingMachine:washing-machine,Watch:watch,WavesArrowDown:waves-arrow-down,WavesArrowUp:waves-arrow-up,WavesHorizontal:waves-horizontal,WavesLadder:waves-ladder,WavesVertical:waves-vertical,Waypoints:waypoints,Webcam:webcam,WebcamOff:webcam-off,Webhook:webhook,WebhookOff:webhook-off,Weight:weight,WeightTilde:weight-tilde,Wheat:wheat,WheatOff:wheat-off,Whistle:whistle,WholeWord:whole-word,Wifi:wifi,WifiCog:wifi-cog,WifiHigh:wifi-high,WifiLow:wifi-low,WifiOff:wifi-off,WifiPen:wifi-pen,WifiSync:wifi-sync,WifiZero:wifi-zero,Wind:wind,WindArrowDown:wind-arrow-down,Wine:wine,WineOff:wine-off,Workflow:workflow,Worm:worm,Wrench:wrench,WrenchOff:wrench-off,X:x,XLineTop:x-line-top,Zap:zap,ZapOff:zap-off,ZodiacAquarius:zodiac-aquarius,ZodiacAries:zodiac-aries,ZodiacCancer:zodiac-cancer,ZodiacCapricorn:zodiac-capricorn,ZodiacGemini:zodiac-gemini,ZodiacLeo:zodiac-leo,ZodiacLibra:zodiac-libra,ZodiacOphiuchus:zodiac-ophiuchus,ZodiacPisces:zodiac-pisces,ZodiacSagittarius:zodiac-sagittarius,ZodiacScorpio:zodiac-scorpio,ZodiacTaurus:zodiac-taurus,ZodiacVirgo:zodiac-virgo,ZoomIn:zoom-in,ZoomOut:zoom-out";
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
import type * as React from 'react';
|
|
9
|
+
/**
|
|
10
|
+
* The payload of the `slider-thumb-pass-through` local patch
|
|
11
|
+
* (`scripts/shadcn-local-patches.mjs`, objectui#3318).
|
|
12
|
+
*
|
|
13
|
+
* ## The defect this exists for
|
|
14
|
+
*
|
|
15
|
+
* A Radix slider's focusable control is the THUMB — `span[role="slider"]`,
|
|
16
|
+
* `tabindex="0"`, the element that carries `aria-valuenow` and the one a
|
|
17
|
+
* keyboard user and their screen reader actually land on. `Slider.Root` renders
|
|
18
|
+
* a role-less wrapper `span` and forwards every unrecognised prop to it, so a
|
|
19
|
+
* host's control-channel facts (`id`, `aria-invalid`, `aria-describedby`,
|
|
20
|
+
* `aria-labelledby`, `aria-required`) landed on a wrapper assistive technology
|
|
21
|
+
* never visits. Measured on `origin/main`, a real form + a required slider that
|
|
22
|
+
* had just failed validation:
|
|
23
|
+
*
|
|
24
|
+
* ```
|
|
25
|
+
* slider ariaInvalidTrue=[] labelFor=…-form-item -> DANGLING
|
|
26
|
+
* descConsumers=0 focusable=[span[slider],input]
|
|
27
|
+
* ids=[] <- no element of the row carried an id at all
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* This is the same shape objectui#3306 fixed for `select`, one step harder:
|
|
31
|
+
* there the focusable control is `SelectTrigger`, a component the primitive
|
|
32
|
+
* EXPORTS, so the widget could address it directly. `ui/slider.tsx` renders its
|
|
33
|
+
* thumb internally and exports only `Slider`, so the widget has no handle on
|
|
34
|
+
* the one element that must carry the state — hence a pass-through.
|
|
35
|
+
*
|
|
36
|
+
* ## Why a declared prop and not an implicit bridge
|
|
37
|
+
*
|
|
38
|
+
* The primitive could instead have COPIED a fixed list of `aria-*` keys from
|
|
39
|
+
* its own props down to the thumb. Rejected: the copy would leave the same keys
|
|
40
|
+
* on Root as well, and for `id` that is not a duplicate attribute but a
|
|
41
|
+
* duplicate DOM ID — `document.getElementById` answers with the wrapper, so a
|
|
42
|
+
* host `<label for>` would resolve to the non-focusable span and the bug would
|
|
43
|
+
* survive its own fix wearing a green test. Splitting is therefore mandatory,
|
|
44
|
+
* and once the caller must say which keys go where, saying it explicitly is
|
|
45
|
+
* strictly better than a list the caller cannot see (AGENTS.md #0.1: one strict
|
|
46
|
+
* contract, no consumer-side guessing).
|
|
47
|
+
*
|
|
48
|
+
* ## Where the split is decided
|
|
49
|
+
*
|
|
50
|
+
* Not here — this only routes. The widget decides, and `SliderField` mirrors
|
|
51
|
+
* `SelectField`'s #3306 split exactly: `name` and `disabled` stay on Root (Root
|
|
52
|
+
* owns the hidden form input and is the single disabled authority), everything
|
|
53
|
+
* else in the DOM pass-through whitelist goes to the thumb.
|
|
54
|
+
*/
|
|
55
|
+
/** Props the `Slider` wrapper hands to its internal `SliderPrimitive.Thumb`. */
|
|
56
|
+
export interface SliderThumbPassThrough {
|
|
57
|
+
/**
|
|
58
|
+
* Forwarded verbatim onto the focusable `span[role="slider"]`.
|
|
59
|
+
*
|
|
60
|
+
* Deliberately typed as the DOM attribute surface rather than
|
|
61
|
+
* `ComponentPropsWithoutRef<typeof SliderPrimitive.Thumb>`: this module must
|
|
62
|
+
* not import the primitive (it is consumed BY the no-touch file, and a cycle
|
|
63
|
+
* through it would be a fragile thing to hang a sync patch on), and the thumb
|
|
64
|
+
* is a plain `span` as far as every key a host delivers is concerned.
|
|
65
|
+
*/
|
|
66
|
+
thumbProps?: React.HTMLAttributes<HTMLSpanElement> & {
|
|
67
|
+
id?: string;
|
|
68
|
+
tabIndex?: number;
|
|
69
|
+
'aria-label'?: string;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Route a `Slider`'s props to the two elements that need them.
|
|
74
|
+
*
|
|
75
|
+
* `thumbProps` is REMOVED from the root half — leaving it there would put
|
|
76
|
+
* `thumbprops="[object Object]"` on the wrapper span, which is exactly the leak
|
|
77
|
+
* objectui#3291's sweep exists to catch.
|
|
78
|
+
*
|
|
79
|
+
* The pre-existing `aria-label` bridge is preserved and applied FIRST, so a
|
|
80
|
+
* caller that passes both keeps the explicit `thumbProps` value; nothing about
|
|
81
|
+
* the attribute's previous behaviour changes for callers that pass neither.
|
|
82
|
+
*/
|
|
83
|
+
export declare function splitSliderThumbProps<P extends Record<string, unknown>>(props: P): {
|
|
84
|
+
root: Omit<P, 'thumbProps'>;
|
|
85
|
+
thumb: Record<string, unknown>;
|
|
86
|
+
};
|
package/dist/lib/utils.d.ts
CHANGED
|
@@ -1,4 +1,117 @@
|
|
|
1
1
|
import { ClassValue } from 'clsx';
|
|
2
2
|
import { default as React } from 'react';
|
|
3
3
|
export declare function cn(...inputs: ClassValue[]): string;
|
|
4
|
+
/**
|
|
5
|
+
* The ONE emptiness predicate for a `SchemaNode` slot (objectui#9162).
|
|
6
|
+
*
|
|
7
|
+
* A node slot's published zod face carries a `z.number()` arm
|
|
8
|
+
* (`nodeUnionOptions`, `packages/types/src/zod/base.zod.ts`), so `children: 0`
|
|
9
|
+
* is legal authored input — and React RENDERS numbers. Truthiness is therefore
|
|
10
|
+
* the rule a node slot states: every falsy value (`0`, `-0`, `NaN`, `''`,
|
|
11
|
+
* `false`, `null`, `undefined`) means "this slot has no content", plus the
|
|
12
|
+
* empty array, which has no content either.
|
|
13
|
+
*
|
|
14
|
+
* ⛔ Not a nullish test. `0` is not "absent"; it is present and renders
|
|
15
|
+
* nothing, which is the distinction objectui#8331 kept deliberately and
|
|
16
|
+
* objectui#9033 kept again: truthiness makes the slot's answer independent of
|
|
17
|
+
* `toRenderableSchema`, and that independence is what kept the sibling slot out
|
|
18
|
+
* of the defect while the bridge was wrong.
|
|
19
|
+
*
|
|
20
|
+
* ⛔ Not a `typeof === 'object'` test either. objectui#7105 ruled that node
|
|
21
|
+
* slots RELAX the renderer rather than narrow the declaration — a bare string
|
|
22
|
+
* is a legal node and renders as its own text.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isEmptyNodeSlot(slot: unknown): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Render a `SchemaNode` slot that lives inside chrome which must disappear
|
|
27
|
+
* along with it — `<CardFooter>`, `<DialogFooter>`, a wrapping `<div>`.
|
|
28
|
+
*
|
|
29
|
+
* This exists because the obvious spelling is a trap:
|
|
30
|
+
*
|
|
31
|
+
* ```tsx
|
|
32
|
+
* {schema.footer && <CardFooter>{renderChildren(schema.footer)}</CardFooter>}
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* `&&` does not evaluate to `false` when the slot is falsy — it evaluates to
|
|
36
|
+
* the SLOT, and React paints `0`. Worse, `&&` short-circuits, so
|
|
37
|
+
* `renderChildren`'s own `if (isEmptyNodeSlot) return null` first leg is never
|
|
38
|
+
* reached and the bridge repair of objectui#8908 cannot help either. The class
|
|
39
|
+
* was patched one instance at a time three times (objectui#8331 →
|
|
40
|
+
* objectui#9033 → the eleven of objectui#9162) before it was closed here.
|
|
41
|
+
*
|
|
42
|
+
* `render` receives the slot itself, not a pre-rendered node, because some
|
|
43
|
+
* call sites render it with extra context (`<SchemaRenderer schema={…}
|
|
44
|
+
* data={data} />` in `plugin-detail`). It is invoked ONLY when the slot has
|
|
45
|
+
* content, so the chrome and the content appear and disappear together.
|
|
46
|
+
*
|
|
47
|
+
* A slot with NO chrome does not need this — call `renderChildren(slot)`
|
|
48
|
+
* directly, which is the same guard with nothing wrapped around it. The rule
|
|
49
|
+
* `object-ui/no-bare-node-slot-guard` refuses the `&&` spelling so that these
|
|
50
|
+
* two remain the only two.
|
|
51
|
+
*/
|
|
52
|
+
export declare function renderNodeSlot<T>(slot: T, render: (slot: NonNullable<T>) => React.ReactNode): React.ReactNode;
|
|
4
53
|
export declare function renderChildren(children: any): React.ReactNode;
|
|
54
|
+
/**
|
|
55
|
+
* Render a Radix primitive's `*Trigger` around an authored node slot — or
|
|
56
|
+
* render NOTHING when that slot is empty (objectui#9710; the same defect was
|
|
57
|
+
* repaired one instance at a time on objectui#9701).
|
|
58
|
+
*
|
|
59
|
+
* Two rules live here together, because a call site that reaches for one and
|
|
60
|
+
* forgets the other reintroduces a defect this seam exists to close.
|
|
61
|
+
*
|
|
62
|
+
* ## 1. The trigger is chrome, and chrome disappears with its slot
|
|
63
|
+
*
|
|
64
|
+
* `trigger` is `.optional()` on most of these keys, so a document that omits it
|
|
65
|
+
* is LEGAL. The primitive must then render nothing at all: a `*Trigger` with no
|
|
66
|
+
* content still paints its own element, and an empty `button` is an unlabeled
|
|
67
|
+
* tab stop that a keyboard user lands on with nothing to read. That is
|
|
68
|
+
* {@link renderNodeSlot}'s contract — chrome that appears and disappears with
|
|
69
|
+
* its content — and it is why the emptiness guard is INSIDE this seam rather
|
|
70
|
+
* than at each call site.
|
|
71
|
+
*
|
|
72
|
+
* ⚠️ Radix's `Slot` never objected to the empty case: read from the
|
|
73
|
+
* lockfile-pinned `@radix-ui/react-slot`, the branch that throws is guarded by
|
|
74
|
+
* `if (children || children === 0)`, so a `null` child is returned as-is. The
|
|
75
|
+
* empty arm was never broken by the defect below, and must not be broken by its
|
|
76
|
+
* repair.
|
|
77
|
+
*
|
|
78
|
+
* ## 2. `asChild` asks Radix's structural question, not a `typeof` question
|
|
79
|
+
*
|
|
80
|
+
* `asChild` resolves the primitive to that same `Slot`, which merges its props
|
|
81
|
+
* onto a SINGLE React element and throws on anything else it is actually given.
|
|
82
|
+
* A node slot admits far more: the published `SchemaNode` union names `string`,
|
|
83
|
+
* `number`, `boolean`, `null` and `undefined` beside `BaseSchema`, and the
|
|
84
|
+
* trigger keys add an ARRAY of nodes on top. So an unconditional `asChild`
|
|
85
|
+
* asserted a precondition neither published face ever promised, and the values
|
|
86
|
+
* that missed it THREW: `trigger: 'Open it'` — the most natural thing to write
|
|
87
|
+
* for something called a trigger — validated on both faces and then landed the
|
|
88
|
+
* whole node in `SchemaRenderer`'s error boundary, with no diagnostic naming
|
|
89
|
+
* the key. A multi-node array threw the same way, for the same reason.
|
|
90
|
+
*
|
|
91
|
+
* Where `Slot` cannot serve, the primitive renders its OWN element around the
|
|
92
|
+
* content, so a bare string paints as the trigger's text and stays a real
|
|
93
|
+
* trigger; where it CAN serve, the merge is unchanged.
|
|
94
|
+
*
|
|
95
|
+
* ⛔ Widens no published face. `packages/types` states the accept set and is
|
|
96
|
+
* untouched; the implementation is catching up to a declaration that already
|
|
97
|
+
* said yes — the direction objectui#7105 ruled for node slots, which RELAX the
|
|
98
|
+
* renderer rather than narrow the declaration.
|
|
99
|
+
*
|
|
100
|
+
* ```tsx
|
|
101
|
+
* {renderTriggerSlot(DialogTrigger, schema.trigger)}
|
|
102
|
+
* ```
|
|
103
|
+
*
|
|
104
|
+
* ⚠️ A helper is only reached by an author who calls it, so it is not what
|
|
105
|
+
* keeps the next overlay key out of either defect. That is
|
|
106
|
+
* `overlay-trigger-bare-string-9710.test.tsx`, which enumerates the REGISTRY
|
|
107
|
+
* for blocks declaring a `trigger` slot rather than naming files, and reads the
|
|
108
|
+
* zod faces for which of them may legally omit one — so a ninth key is covered
|
|
109
|
+
* on the day it registers, whatever spelling it reached for. ⚠️ That pin is
|
|
110
|
+
* also the ONLY live instrument for this class: a repaired call site carries no
|
|
111
|
+
* `asChild` attribute and no `*Trigger` tag, so a source grep can no longer
|
|
112
|
+
* tell a repaired renderer from a deleted one.
|
|
113
|
+
*/
|
|
114
|
+
export declare function renderTriggerSlot(Trigger: React.ComponentType<{
|
|
115
|
+
asChild?: boolean;
|
|
116
|
+
children?: React.ReactNode;
|
|
117
|
+
}>, slot: unknown): React.ReactNode;
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
* Every one of these used to be handed to `onToast` regardless of type, so all
|
|
20
20
|
* five looked identical (#3014).
|
|
21
21
|
*/
|
|
22
|
-
export { NotificationBanners, type NotificationBannersProps } from './NotificationBanners';
|
|
23
|
-
export { NotificationSnackbar, type NotificationSnackbarProps } from './NotificationSnackbar';
|
|
24
|
-
export { NotificationAlerts, type NotificationAlertsProps } from './NotificationAlerts';
|
|
25
|
-
export { NotificationInline, type NotificationInlineProps } from './NotificationInline';
|
|
26
|
-
export { NOTIFICATION_ACTION_BUTTON_VARIANTS, NOTIFICATION_POSITION_CLASSES, NOTIFICATION_SEVERITY_STYLES, notificationActionVariant, notificationIcon, notificationSeverityStyle, type NotificationSeverityStyle, } from './severity';
|
|
22
|
+
export { NotificationBanners, type NotificationBannersProps } from './NotificationBanners.js';
|
|
23
|
+
export { NotificationSnackbar, type NotificationSnackbarProps } from './NotificationSnackbar.js';
|
|
24
|
+
export { NotificationAlerts, type NotificationAlertsProps } from './NotificationAlerts.js';
|
|
25
|
+
export { NotificationInline, type NotificationInlineProps } from './NotificationInline.js';
|
|
26
|
+
export { NOTIFICATION_ACTION_BUTTON_VARIANTS, NOTIFICATION_POSITION_CLASSES, NOTIFICATION_SEVERITY_STYLES, notificationActionVariant, notificationIcon, notificationSeverityStyle, type NotificationSeverityStyle, } from './severity.js';
|
|
@@ -1,36 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
* {@link maxVisible}. They share a single overflow button with any business
|
|
10
|
-
* actions that spilled past {@link maxVisible}, guaranteeing at most one
|
|
11
|
-
* "More" menu per bar.
|
|
12
|
-
*
|
|
13
|
-
* The first system action is automatically separated from business-overflow
|
|
14
|
-
* entries by a menu separator.
|
|
15
|
-
*/
|
|
16
|
-
systemActions?: UIActionSchema[];
|
|
17
|
-
/** Filter actions by this location */
|
|
18
|
-
location?: ActionLocation;
|
|
19
|
-
/** Maximum visible inline actions before overflow into "More" menu (default: 3) */
|
|
20
|
-
maxVisible?: number;
|
|
21
|
-
/** Maximum visible inline actions on mobile devices (default: 1). Desktop uses maxVisible instead. */
|
|
22
|
-
mobileMaxVisible?: number;
|
|
23
|
-
/** Visibility condition expression */
|
|
24
|
-
visible?: string;
|
|
25
|
-
/** Layout direction */
|
|
26
|
-
direction?: 'horizontal' | 'vertical';
|
|
27
|
-
/** Gap between items (Tailwind gap class, default: 'gap-2') */
|
|
28
|
-
gap?: string;
|
|
29
|
-
/** Button variant for all actions (can be overridden per-action) */
|
|
30
|
-
variant?: string;
|
|
31
|
-
/** Button size for all actions (can be overridden per-action) */
|
|
32
|
-
size?: string;
|
|
33
|
-
/** Custom CSS class */
|
|
34
|
-
className?: string;
|
|
35
|
-
[key: string]: any;
|
|
36
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
@@ -5,11 +5,14 @@ import { UIActionSchema } from '@object-ui/types';
|
|
|
5
5
|
* `bodyShape`, `locations`, `enabled`, `size` — is declared by the modern type
|
|
6
6
|
* and by no other, and the legacy `crud.ts` `ActionSchema` it used to name is
|
|
7
7
|
* `@deprecated` and requires `type: 'action'` (this renderer serves
|
|
8
|
-
* `'script' | 'url' | 'modal' | 'flow' | 'api'`).
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* `'script' | 'url' | 'modal' | 'flow' | 'api'`).
|
|
9
|
+
*
|
|
10
|
+
* `actionType` is the DECLARED input carrying the action's execution type
|
|
11
|
+
* (objectui#7415, objectstack#14490 ruling A). `type` stays on the intersection
|
|
12
|
+
* as the SDUI envelope's component discriminator — `'action:button'` on every
|
|
13
|
+
* authored path — and is no longer read as an action type by anything here.
|
|
11
14
|
*/
|
|
12
|
-
export interface
|
|
15
|
+
export interface ActionButtonRendererProps {
|
|
13
16
|
schema: UIActionSchema & {
|
|
14
17
|
type: string;
|
|
15
18
|
className?: string;
|
|
@@ -18,5 +21,13 @@ export interface ActionButtonProps {
|
|
|
18
21
|
className?: string;
|
|
19
22
|
/** Override context for this specific action */
|
|
20
23
|
context?: Record<string, any>;
|
|
24
|
+
/**
|
|
25
|
+
* The host-EVALUATED enablement verdict, declared rather than left to the
|
|
26
|
+
* index signature (objectui#9131). `SchemaRenderer` evaluates the node's
|
|
27
|
+
* `disabled` / `disabledOn` and forwards the answer under this name as
|
|
28
|
+
* `disabled: __disabled || undefined`. It is consumed by name below and
|
|
29
|
+
* therefore never reaches the DOM spread — see the destructure.
|
|
30
|
+
*/
|
|
31
|
+
disabled?: boolean;
|
|
21
32
|
[key: string]: any;
|
|
22
33
|
}
|
|
@@ -2,8 +2,6 @@ import { default as React } from 'react';
|
|
|
2
2
|
import { UIActionSchema, ActionLocation } from '@object-ui/types';
|
|
3
3
|
export interface ActionGroupSchema {
|
|
4
4
|
type: 'action:group';
|
|
5
|
-
/** Group name */
|
|
6
|
-
name?: string;
|
|
7
5
|
/** Group label */
|
|
8
6
|
label?: string;
|
|
9
7
|
/** Group icon */
|
|
@@ -14,8 +12,11 @@ export interface ActionGroupSchema {
|
|
|
14
12
|
display?: 'dropdown' | 'inline';
|
|
15
13
|
/** Filter actions by location */
|
|
16
14
|
location?: ActionLocation;
|
|
17
|
-
/** Group visibility
|
|
18
|
-
visible?: string
|
|
15
|
+
/** Group visibility predicate: a boolean, a CEL string, or a `{ dialect, source }` envelope */
|
|
16
|
+
visible?: boolean | string | {
|
|
17
|
+
dialect: string;
|
|
18
|
+
source?: string;
|
|
19
|
+
};
|
|
19
20
|
/** Button variant for inline actions */
|
|
20
21
|
variant?: string;
|
|
21
22
|
/** Button size for inline actions */
|