@object-ui/components 17.6.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.
Files changed (56) hide show
  1. package/CHANGELOG.md +8750 -0
  2. package/README.md +5 -3
  3. package/dist/custom/button-group.d.ts +1 -1
  4. package/dist/custom/combobox.d.ts +2 -4
  5. package/dist/custom/empty.d.ts +16 -4
  6. package/dist/custom/field.d.ts +1 -1
  7. package/dist/custom/filter-builder.d.ts +198 -66
  8. package/dist/custom/index.d.ts +0 -1
  9. package/dist/custom/item.d.ts +1 -1
  10. package/dist/custom/kbd.d.ts +1 -1
  11. package/dist/custom/mobile-dialog-content.d.ts +22 -1
  12. package/dist/custom/navigation-overlay.d.ts +105 -0
  13. package/dist/custom/refresh-indicator.d.ts +8 -2
  14. package/dist/custom/view-states.d.ts +74 -1
  15. package/dist/hooks/related-count-store.d.ts +26 -28
  16. package/dist/index.css +157 -363
  17. package/dist/index.d.ts +3 -3
  18. package/dist/index.js +6603 -5987
  19. package/dist/index.umd.cjs +10 -15
  20. package/dist/lib/close-label.d.ts +1 -2
  21. package/dist/lib/date-fns-locale.d.ts +41 -0
  22. package/dist/lib/lazy-icon.d.ts +32 -1
  23. package/dist/lib/lucide-record-icon-names.d.ts +30 -0
  24. package/dist/lib/utils.d.ts +113 -0
  25. package/dist/renderers/action/action-bar.d.ts +8 -36
  26. package/dist/renderers/action/action-button.d.ts +15 -4
  27. package/dist/renderers/action/action-group.d.ts +5 -4
  28. package/dist/renderers/action/action-icon.d.ts +12 -2
  29. package/dist/renderers/action/action-menu.d.ts +5 -2
  30. package/dist/renderers/action/auto-trigger.d.ts +19 -4
  31. package/dist/renderers/action/resolve-icon.d.ts +27 -2
  32. package/dist/renderers/action/static-params.d.ts +79 -0
  33. package/dist/renderers/action/visibility-gate.d.ts +11 -3
  34. package/dist/renderers/basic/elements.d.ts +3 -0
  35. package/dist/renderers/basic/html-elements.d.ts +7 -3
  36. package/dist/renderers/basic/readProps.d.ts +60 -0
  37. package/dist/renderers/complex/data-table.d.ts +31 -14
  38. package/dist/renderers/complex/dataTableBindDiagnostic.d.ts +187 -0
  39. package/dist/renderers/layout/box.d.ts +8 -0
  40. package/dist/renderers/layout/containers.d.ts +1 -10
  41. package/dist/renderers/layout/react-page.d.ts +4 -0
  42. package/dist/renderers/navigation/sidebar.d.ts +31 -0
  43. package/dist/ui/badge.d.ts +1 -1
  44. package/dist/ui/button.d.ts +1 -1
  45. package/dist/ui/calendar.d.ts +2 -1
  46. package/dist/ui/command.d.ts +7 -7
  47. package/dist/ui/index.d.ts +0 -1
  48. package/dist/ui/input-otp.d.ts +2 -2
  49. package/dist/ui/sheet.d.ts +1 -1
  50. package/dist/ui/sidebar.d.ts +2 -1
  51. package/package.json +13 -14
  52. package/dist/SchemaRenderer.d.ts +0 -4
  53. package/dist/custom/export-progress-dialog.d.ts +0 -43
  54. package/dist/hooks/use-export-job.d.ts +0 -34
  55. package/dist/ui/chart.d.ts +0 -56
  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;
@@ -1,5 +1,36 @@
1
1
  import { default as React } from 'react';
2
- /** Convert PascalCase / camelCase / mixed names to kebab-case for DynamicIcon. */
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";
@@ -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;
@@ -1,36 +1,8 @@
1
- import { UIActionSchema, ActionLocation } from '@object-ui/types';
2
- export interface ActionBarSchema {
3
- type: 'action:bar';
4
- /** Business actions to render — subject to inline/overflow split via {@link maxVisible} */
5
- actions?: UIActionSchema[];
6
- /**
7
- * System/chrome actions (Duplicate, Export, View History, Delete, etc.) that
8
- * are *always* placed in the overflow menu — never inline — regardless of
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'`). `actionType` stays on the
9
- * intersection: it is the legacy-shaped override this renderer reads FIRST
10
- * (`schema.actionType || schema.type`), and it is not a `UIActionSchema` key.
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 ActionButtonProps {
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 condition */
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 */
@@ -5,14 +5,24 @@ import { UIActionSchema } from '@object-ui/types';
5
5
  * `locations`, `enabled` and `size` are all modern-only keys this renderer
6
6
  * forwards, and the legacy `crud.ts` `ActionSchema` is `@deprecated` and pins
7
7
  * `type: 'action'` where this renderer's own registry `inputs` declare
8
- * `'script' | 'url' | 'modal' | 'flow' | 'api'`.
8
+ * `'script' | 'url' | 'modal' | 'flow' | 'api'`. `actionType` is the DECLARED
9
+ * input carrying that execution type (objectui#7415), for the same reason it is
10
+ * on `action:button`; `type` stays on the intersection as the SDUI envelope's
11
+ * component discriminator and is not read as an action type here.
9
12
  */
10
- export interface ActionIconProps {
13
+ export interface ActionIconRendererProps {
11
14
  schema: UIActionSchema & {
12
15
  type: string;
13
16
  className?: string;
17
+ actionType?: string;
14
18
  };
15
19
  className?: string;
16
20
  context?: Record<string, any>;
21
+ /**
22
+ * The host-EVALUATED enablement verdict — see `ActionButtonRendererProps` for the
23
+ * mechanism (objectui#9131). Declared rather than left to the index
24
+ * signature, consumed by name below, never re-spread onto the DOM.
25
+ */
26
+ disabled?: boolean;
17
27
  [key: string]: any;
18
28
  }
@@ -12,8 +12,11 @@ export interface ActionMenuSchema {
12
12
  variant?: string;
13
13
  /** Trigger size */
14
14
  size?: string;
15
- /** Visibility condition */
16
- visible?: string;
15
+ /** Visibility predicate: a boolean, a CEL string, or a `{ dialect, source }` envelope */
16
+ visible?: boolean | string | {
17
+ dialect: string;
18
+ source?: string;
19
+ };
17
20
  /** Custom CSS class */
18
21
  className?: string;
19
22
  [key: string]: any;
@@ -11,10 +11,25 @@
11
11
  * another. Deliberately strict: only the literal `true` arms it.
12
12
  */
13
13
  export declare function hasAutoTrigger(action: unknown): boolean;
14
+ /** The fields of an action this module reads. */
15
+ export interface AutoTriggerSubject {
16
+ autoTrigger?: unknown;
17
+ visible?: unknown;
18
+ name?: string;
19
+ label?: string;
20
+ }
14
21
  /**
15
- * Run `run` at most once, as soon as `armed` is true.
22
+ * Run `run` at most once, as soon as `action` asks to be auto-triggered — unless
23
+ * the action's own declared `visible` gate hides it, in which case the trigger
24
+ * is refused and reported instead (objectui#4191).
16
25
  *
17
- * `run` may change identity freely (it is rebuilt from `schema` on most
18
- * renders); the ref is what makes this once-only, so depending on it is safe.
26
+ * @param action The action the renderer received (read: `autoTrigger`,
27
+ * `visible`, `name`, `label`).
28
+ * @param isVisible The renderer's own evaluated `visible` verdict — the same
29
+ * value its early return consults. Only consulted when the
30
+ * action DECLARES a gate, exactly like that early return.
31
+ * @param run The renderer's click path. It may change identity freely (it
32
+ * is rebuilt from `schema` on most renders); the ref is what
33
+ * makes this once-only, so depending on it is safe.
19
34
  */
20
- export declare function useAutoTriggerOnce(armed: boolean, run: () => void | Promise<void>): void;
35
+ export declare function useAutoTriggerOnce(action: AutoTriggerSubject, isVisible: boolean, run: () => void | Promise<void>): void;
@@ -1,6 +1,31 @@
1
1
  import { LucideIcon } from 'lucide-react';
2
2
  /**
3
- * Resolve a Lucide icon by its kebab-case name.
4
- * Returns null if not found.
3
+ * The lookup this seam performs, exposed for DIAGNOSTICS only.
4
+ *
5
+ * `renderers/basic/icon.tsx` names both halves in its objectui#5631 warning
6
+ * (`lookup: "Home" -> "House"`), and that message is under a maintainer ruling
7
+ * 一字不动. Without this it would need its own copy of the tokeniser and the
8
+ * map to keep saying the same thing — which is precisely the duplication this
9
+ * card removed. ⛔ It decides nothing: no call site can change what resolves by
10
+ * reading it.
11
+ */
12
+ export declare function describeIconLookup(name: string): {
13
+ pascal: string;
14
+ key: string;
15
+ };
16
+ /**
17
+ * Resolve an authored Lucide icon name to its component.
18
+ *
19
+ * Accepts kebab-case, snake_case, space-separated and PascalCase spellings.
20
+ * Returns `null` when the name is absent or names no live glyph — deciding what
21
+ * to draw instead belongs to the caller (see the module docblock).
22
+ *
23
+ * ⚠️ The component this returns draws its `<svg>` — with lucide's own classes,
24
+ * box and attributes — SYNCHRONOUSLY, and fills in the path data when the
25
+ * icon's module arrives (objectui#9251). So `svg.lucide-house` matches on the
26
+ * first frame and nothing reflows, while the 1,781 icon modules stay off the
27
+ * eager path. ⛔ A test that asserts on the PATHS inside the svg must await
28
+ * them (`findBy*` / `waitFor`); everything that asks which icon this is —
29
+ * including `null` vs not — is answered in the same tick, as before.
5
30
  */
6
31
  export declare function resolveIcon(name: string | undefined): LucideIcon | null;
@@ -0,0 +1,79 @@
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
+ /** The two keys this module reads off an action node. */
9
+ export interface StaticParamsSubject {
10
+ params?: unknown;
11
+ properties?: unknown;
12
+ name?: unknown;
13
+ label?: unknown;
14
+ }
15
+ /** Reset the warn-once memo. Exported for tests. */
16
+ export declare function resetStaticParamsWarnings(): void;
17
+ /**
18
+ * The static values to forward as the runner's `ActionDef.params`: the node's
19
+ * `properties.params` when it is an object bag, otherwise `undefined`.
20
+ *
21
+ * A node-level OBJECT `params` that is not the hoisted `properties.params` is
22
+ * never returned; it triggers the development warning above.
23
+ */
24
+ export declare function readStaticParamValues(subject: StaticParamsSubject, where: string): Record<string, unknown> | undefined;
25
+ /**
26
+ * Evaluates a config bag the way `SchemaRenderer` evaluates `properties`: the
27
+ * function `useConfigBagEvaluator()` (`@object-ui/react`) returns.
28
+ */
29
+ export type ConfigBagEvaluator = (bag: unknown) => unknown;
30
+ /**
31
+ * A container MEMBER with its `properties` evaluated (objectui#10290).
32
+ *
33
+ * `action:bar`, `action:group` and `action:menu` draw their member actions
34
+ * themselves, so a member never passes through the `SchemaRenderer` memo that
35
+ * evaluates a node's `properties`. Its static values ride `properties.params`
36
+ * (objectui#10289), and they are templates (objectui#7867): on a record page,
37
+ * `"recordId": "${record.id}"` has to reach the handler as the record's id. The
38
+ * container evaluates the member's `properties` with the memo's own evaluator
39
+ * and scope (`evaluateBag`, from `useConfigBagEvaluator()`), once, where it
40
+ * composes or runs the member.
41
+ *
42
+ * Returns the member itself when it carries no `properties` bag. Only
43
+ * `properties` is evaluated. It is not copied onto the member (the memo's
44
+ * hoist), and the member's other keys are left as authored.
45
+ */
46
+ export declare function withEvaluatedProperties<T extends object>(member: T, evaluateBag: ConfigBagEvaluator): T;
47
+ /**
48
+ * A container member's static values (objectui#10290): its `properties.params`,
49
+ * evaluated through {@link withEvaluatedProperties}, or `undefined`.
50
+ *
51
+ * For `action:group` / `action:menu` items, which run the member themselves.
52
+ * (`action:bar` hands an inline member to `action:button` / `action:icon` with
53
+ * its `properties` already evaluated, and `readStaticParamValues` reads it
54
+ * there.)
55
+ */
56
+ export declare function readMemberStaticParamValues(member: StaticParamsSubject, evaluateBag: ConfigBagEvaluator): Record<string, unknown> | undefined;
57
+ /**
58
+ * The same ruling on a spec ACTION ENTRY (objectui#10462): `element:button`'s
59
+ * inline `action`, `action:group` / `action:menu` items and `page:header`'s
60
+ * actions. `params` is an entry's `ActionParam[]` input list and nothing else.
61
+ * (An `action:group` / `action:menu` item is also a container member, so its
62
+ * static values are read from `properties.params` and evaluated by the
63
+ * container through {@link readMemberStaticParamValues} (objectui#10290).
64
+ * `UIActionSchema` declares no `properties`, so on a container member this bag
65
+ * is read off the authored object, not off a declared key. `element:button`'s
66
+ * inline `action` and `page:header`'s actions do not read
67
+ * `properties.params`.)
68
+ *
69
+ * One type is still different: `api`. The objectstack#5777 window keeps the
70
+ * runner reading an object `params` as the request payload (with its own
71
+ * development warning, naming `bodyExtra`) until 18, so for `api` the object is
72
+ * returned unchanged. For every other type it is not returned, and a
73
+ * development build says so once per action.
74
+ *
75
+ * `type` is the executor the surface dispatches the entry as. Call this on the
76
+ * non-array branch only; an array `params` is the input list, forwarded as
77
+ * `actionParams`.
78
+ */
79
+ export declare function readActionEntryParamValues(entry: StaticParamsSubject, type: unknown, where: string): Record<string, unknown> | undefined;