@object-ui/components 16.1.0 → 17.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -150,6 +150,34 @@ function MyComponent() {
150
150
  - `link` - Link component
151
151
  - `breadcrumb` - Breadcrumb navigation
152
152
 
153
+ ## Notification Surfaces
154
+
155
+ Direct-import React components (not schema blocks) that render the notifications
156
+ raised through `NotificationProvider` from `@object-ui/react`. One per spec
157
+ `displayType`, so a `banner` no longer presents as a toast:
158
+
159
+ | Component | `displayType` | Where to mount it |
160
+ | --- | --- | --- |
161
+ | `<NotificationSnackbar />` | `snackbar` | anywhere inside the provider — it anchors itself bottom-center |
162
+ | `<NotificationBanners />` | `banner` | top of the content area (it takes space in the flow) |
163
+ | `<NotificationAlerts />` | `alert` | anywhere inside the provider — blocking dialog, FIFO queue |
164
+ | `<NotificationInline scope="…" />` | `inline` | in the surface that raises them |
165
+
166
+ `toast` stays with the host's `onToast` delegate (sonner in the console). All of
167
+ them draw the notification's `severity` icon unless it declares an `icon`
168
+ override naming a real Lucide icon. See the
169
+ [notifications guide](https://objectui.org/docs/guide/notifications).
170
+
171
+ ```tsx
172
+ import { NotificationBanners, NotificationAlerts } from '@object-ui/components';
173
+
174
+ <main>
175
+ <NotificationBanners />
176
+ <Outlet />
177
+ <NotificationAlerts />
178
+ </main>
179
+ ```
180
+
153
181
  ## Customization
154
182
 
155
183
  ### Override Styles
@@ -8,6 +8,12 @@ import { VariantProps } from 'class-variance-authority';
8
8
  */
9
9
  import * as React from "react";
10
10
  declare const fieldVariants: (props?: import('class-variance-authority/types').ClassProp | undefined) => string;
11
+ /**
12
+ * Props for {@link FieldContainer}.
13
+ *
14
+ * Note this one keeps its natural name: the spec does not export `FieldProps`.
15
+ * Only the component itself had to move — see the note on `FieldContainer`.
16
+ */
11
17
  export interface FieldProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof fieldVariants> {
12
18
  label?: React.ReactNode;
13
19
  description?: React.ReactNode;
@@ -15,5 +21,17 @@ export interface FieldProps extends React.HTMLAttributes<HTMLDivElement>, Varian
15
21
  required?: boolean;
16
22
  htmlFor?: string;
17
23
  }
18
- declare const Field: React.ForwardRefExoticComponent<FieldProps & React.RefAttributes<HTMLDivElement>>;
19
- export { Field };
24
+ /**
25
+ * A labelled form-control wrapper: label, slotted control, description, error.
26
+ *
27
+ * Named `FieldContainer`, not `Field` (objectstack#4115): `@objectstack/spec/data`
28
+ * exports `Field` — an object FIELD's metadata (type, reference_to, options,
29
+ * permissions, …) and its builder namespace — which has nothing to do with this
30
+ * `<div>`. Two unrelated things under one name is the defect that issue exists
31
+ * to remove; `@object-ui/app-shell` already renamed the same kind of collision
32
+ * (`FieldInput` → `ScreenFieldInput`, objectui#3169) for the same reason.
33
+ * `__tests__/share-filter-sort-spec-parity.test.ts` pins that the spec does not
34
+ * own the new name.
35
+ */
36
+ declare const FieldContainer: React.ForwardRefExoticComponent<FieldProps & React.RefAttributes<HTMLDivElement>>;
37
+ export { FieldContainer };
@@ -6,7 +6,23 @@
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
8
  import * as React from "react";
9
- export interface FilterCondition {
9
+ /**
10
+ * One row of the FilterBuilder UI.
11
+ *
12
+ * Deliberately NOT `FilterCondition` (objectstack#4115): the spec owns that
13
+ * name for the RECURSIVE ObjectQL predicate AST — `{ [field]: FieldOperators }`
14
+ * with `$and` / `$or` / `$not` branches — which is a query, not a row. This is
15
+ * one flat `{ field, operator, value }` line plus the React key the list needs,
16
+ * and `operator` here is the builder's own dropdown vocabulary
17
+ * (`FILTER_BUILDER_OPERATORS`), not the spec's `$`-tokens.
18
+ *
19
+ * `@object-ui/types` already renamed its identical concept to
20
+ * `FilterBuilderCondition` (objectui#3068); this is the same thing, so it takes
21
+ * the same name rather than inventing a second dialect. Note the same name is
22
+ * NOT the right answer everywhere: `@object-ui/app-shell`'s `FilterCondition`
23
+ * really was the spec's ObjectQL AST and was re-exported (objectui#3169).
24
+ */
25
+ export interface FilterBuilderCondition {
10
26
  id: string;
11
27
  field: string;
12
28
  operator: string;
@@ -15,7 +31,7 @@ export interface FilterCondition {
15
31
  export interface FilterGroup {
16
32
  id: string;
17
33
  logic: "and" | "or";
18
- conditions: FilterCondition[];
34
+ conditions: FilterBuilderCondition[];
19
35
  }
20
36
  export interface FilterBuilderProps {
21
37
  fields?: Array<{
@@ -38,6 +54,84 @@ export interface FilterBuilderProps {
38
54
  className?: string;
39
55
  showClearAll?: boolean;
40
56
  }
57
+ declare const defaultOperators: readonly [{
58
+ readonly value: "equals";
59
+ readonly label: "Equals";
60
+ }, {
61
+ readonly value: "notEquals";
62
+ readonly label: "Does not equal";
63
+ }, {
64
+ readonly value: "contains";
65
+ readonly label: "Contains";
66
+ }, {
67
+ readonly value: "notContains";
68
+ readonly label: "Does not contain";
69
+ }, {
70
+ readonly value: "isEmpty";
71
+ readonly label: "Is empty";
72
+ }, {
73
+ readonly value: "isNotEmpty";
74
+ readonly label: "Is not empty";
75
+ }, {
76
+ readonly value: "greaterThan";
77
+ readonly label: "Greater than";
78
+ }, {
79
+ readonly value: "lessThan";
80
+ readonly label: "Less than";
81
+ }, {
82
+ readonly value: "greaterOrEqual";
83
+ readonly label: "Greater than or equal";
84
+ }, {
85
+ readonly value: "lessOrEqual";
86
+ readonly label: "Less than or equal";
87
+ }, {
88
+ readonly value: "before";
89
+ readonly label: "Before";
90
+ }, {
91
+ readonly value: "after";
92
+ readonly label: "After";
93
+ }, {
94
+ readonly value: "between";
95
+ readonly label: "Between";
96
+ }, {
97
+ readonly value: "in";
98
+ readonly label: "In";
99
+ }, {
100
+ readonly value: "notIn";
101
+ readonly label: "Not in";
102
+ }, {
103
+ readonly value: "startsWith";
104
+ readonly label: "Starts with";
105
+ }, {
106
+ readonly value: "endsWith";
107
+ readonly label: "Ends with";
108
+ }, {
109
+ readonly value: "isNull";
110
+ readonly label: "Is null";
111
+ }, {
112
+ readonly value: "isNotNull";
113
+ readonly label: "Is not null";
114
+ }, {
115
+ readonly value: "exists";
116
+ readonly label: "Is set";
117
+ }, {
118
+ readonly value: "notExists";
119
+ readonly label: "Is not set";
120
+ }];
121
+ /**
122
+ * The FilterBuilder's own operator vocabulary — every id its dropdown can
123
+ * hold, derived from the operators it actually renders.
124
+ *
125
+ * Exported because several translation tables map an external vocabulary
126
+ * (the spec's `VIEW_FILTER_OPERATORS`, Mongo `$`-tokens) *onto* this one, and
127
+ * a value that is not in this list produces a condition row whose operator
128
+ * select has nothing to select. Those tables assert against this export
129
+ * rather than restating it, so adding an operator here is the only edit
130
+ * needed to widen them.
131
+ */
132
+ export declare const FILTER_BUILDER_OPERATORS: ("endsWith" | "startsWith" | "in" | "after" | "equals" | "notEquals" | "contains" | "notContains" | "isEmpty" | "isNotEmpty" | "greaterThan" | "lessThan" | "greaterOrEqual" | "lessOrEqual" | "before" | "between" | "notIn" | "isNull" | "isNotNull" | "exists" | "notExists")[];
133
+ /** An operator id the FilterBuilder can render. */
134
+ export type FilterBuilderOperator = (typeof defaultOperators)[number]['value'];
41
135
  declare function FilterBuilder({ fields, value, onChange, className, showClearAll, }: FilterBuilderProps): React.JSX.Element;
42
136
  declare namespace FilterBuilder {
43
137
  var displayName: string;
@@ -51,9 +145,9 @@ interface LookupValuePickerProps {
51
145
  displayField?: string;
52
146
  idField?: string;
53
147
  };
54
- value: FilterCondition["value"];
148
+ value: FilterBuilderCondition["value"];
55
149
  multiple: boolean;
56
- onChange: (value: FilterCondition["value"]) => void;
150
+ onChange: (value: FilterBuilderCondition["value"]) => void;
57
151
  }
58
152
  declare function LookupValuePicker({ field, value, multiple, onChange }: LookupValuePickerProps): React.JSX.Element;
59
153
  export { FilterBuilder, LookupValuePicker };
@@ -12,6 +12,7 @@ export * from './item';
12
12
  export * from './kbd';
13
13
  export * from './native-select';
14
14
  export * from './navigation-overlay';
15
+ export * from './resizable';
15
16
  export * from './section-header';
16
17
  export * from './spinner';
17
18
  export * from './sort-builder';
@@ -0,0 +1,31 @@
1
+ import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '../ui/resizable';
2
+ /**
3
+ * ObjectUI
4
+ * Copyright (c) 2024-present ObjectStack Inc.
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE file in the root directory of this source tree.
8
+ */
9
+ /**
10
+ * The public `Resizable*` export site.
11
+ *
12
+ * This module used to wrap `ResizableHandle` to re-key its stacked-group styles
13
+ * from the dead `data-[panel-group-direction=vertical]` onto the
14
+ * `aria-orientation` attribute react-resizable-panels v4 actually emits (#3024).
15
+ * That fix now lives in `../ui/resizable` itself, so there is nothing left to
16
+ * wrap and all three components pass straight through.
17
+ *
18
+ * Editing `ui/` is normally off-limits (AGENTS.md #7), but that file is no
19
+ * longer upstream-synced: it is hand-migrated to v4 and listed under
20
+ * `customComponents` in `shadcn-components.json`, because upstream still ships
21
+ * the v3 file and re-syncing would break the build. See its header.
22
+ *
23
+ * This module stays as the single public export site rather than folding into
24
+ * `ui/index.ts`: `src/index.ts` star-exports `./ui` and `./custom` side by side,
25
+ * so exporting `Resizable*` from both would collide (TS2308).
26
+ */
27
+ import type * as React from 'react';
28
+ /** Kept on the public surface (it is exported from the package root) even though
29
+ * the wrapper it was introduced for is gone. */
30
+ export type ResizableHandleProps = React.ComponentProps<typeof ResizableHandle>;
31
+ export { ResizableHandle, ResizablePanel, ResizablePanelGroup };
@@ -1,3 +1,4 @@
1
+ import { SortItem as SpecSortItem } from '@objectstack/spec/shared';
1
2
  /**
2
3
  * ObjectUI
3
4
  * Copyright (c) 2024-present ObjectStack Inc.
@@ -6,10 +7,20 @@
6
7
  * LICENSE file in the root directory of this source tree.
7
8
  */
8
9
  import * as React from "react";
9
- export interface SortItem {
10
+ /**
11
+ * One row of the SortBuilder UI: the spec's `SortItem` (`{ field, order }`)
12
+ * plus the React key this list needs.
13
+ *
14
+ * Derived rather than re-declared (objectstack#4115). The old hand copy agreed
15
+ * with the spec key-for-key, which is the state one spec release away from
16
+ * drifting — a new sort key (`nulls`, say) would have appeared in the spec and
17
+ * silently gone missing here. `id` is the ONE local addition and it is
18
+ * synthetic: `normalize()` mints it, and `SortBuilder`'s change comparison
19
+ * strips it before diffing precisely because it is not part of the contract.
20
+ */
21
+ export interface SortItem extends SpecSortItem {
22
+ /** React key for the row. Synthetic — never part of the emitted sort. */
10
23
  id: string;
11
- field: string;
12
- order: 'asc' | 'desc';
13
24
  }
14
25
  export interface SortBuilderProps {
15
26
  fields?: Array<{
package/dist/index.css CHANGED
@@ -19,6 +19,7 @@
19
19
  --color-amber-200: oklch(92.4% 0.12 95.746);
20
20
  --color-amber-300: oklch(87.9% 0.169 91.605);
21
21
  --color-amber-400: oklch(82.8% 0.189 84.429);
22
+ --color-amber-600: oklch(66.6% 0.179 58.318);
22
23
  --color-amber-700: oklch(55.5% 0.163 48.998);
23
24
  --color-amber-800: oklch(47.3% 0.137 46.201);
24
25
  --color-amber-900: oklch(41.4% 0.112 45.904);
@@ -28,11 +29,15 @@
28
29
  --color-yellow-400: oklch(85.2% 0.199 91.936);
29
30
  --color-green-500: oklch(72.3% 0.219 149.579);
30
31
  --color-green-600: oklch(62.7% 0.194 149.214);
32
+ --color-emerald-50: oklch(97.9% 0.021 166.113);
31
33
  --color-emerald-100: oklch(95% 0.052 163.051);
34
+ --color-emerald-200: oklch(90.5% 0.093 164.15);
35
+ --color-emerald-300: oklch(84.5% 0.143 164.978);
32
36
  --color-emerald-400: oklch(76.5% 0.177 163.223);
33
37
  --color-emerald-500: oklch(69.6% 0.17 162.48);
34
38
  --color-emerald-600: oklch(59.6% 0.145 163.225);
35
39
  --color-emerald-700: oklch(50.8% 0.118 165.612);
40
+ --color-emerald-900: oklch(37.8% 0.077 168.94);
36
41
  --color-emerald-950: oklch(26.2% 0.051 172.552);
37
42
  --color-cyan-200: oklch(91.7% 0.08 205.041);
38
43
  --color-cyan-300: oklch(86.5% 0.127 207.078);
@@ -292,6 +297,9 @@
292
297
  }
293
298
  }
294
299
  @layer utilities {
300
+ .\@container {
301
+ container-type: inline-size;
302
+ }
295
303
  .pointer-events-auto {
296
304
  pointer-events: auto;
297
305
  }
@@ -429,6 +437,9 @@
429
437
  .left-2\.5 {
430
438
  left: calc(var(--spacing) * 2.5);
431
439
  }
440
+ .left-4 {
441
+ left: calc(var(--spacing) * 4);
442
+ }
432
443
  .left-\[50\%\] {
433
444
  left: 50%;
434
445
  }
@@ -453,6 +464,9 @@
453
464
  .z-\[9999\] {
454
465
  z-index: 9999;
455
466
  }
467
+ .order-last {
468
+ order: 9999;
469
+ }
456
470
  .col-span-2 {
457
471
  grid-column: span 2 / span 2;
458
472
  }
@@ -558,6 +572,9 @@
558
572
  .mt-auto {
559
573
  margin-top: auto;
560
574
  }
575
+ .-mr-1 {
576
+ margin-right: calc(var(--spacing) * -1);
577
+ }
561
578
  .mr-1 {
562
579
  margin-right: var(--spacing);
563
580
  }
@@ -655,6 +672,10 @@
655
672
  width: var(--cell-size);
656
673
  height: var(--cell-size);
657
674
  }
675
+ .size-1\.5 {
676
+ width: calc(var(--spacing) * 1.5);
677
+ height: calc(var(--spacing) * 1.5);
678
+ }
658
679
  .size-3\.5 {
659
680
  width: calc(var(--spacing) * 3.5);
660
681
  height: calc(var(--spacing) * 3.5);
@@ -872,6 +893,9 @@
872
893
  .min-h-\[200px\] {
873
894
  min-height: 200px;
874
895
  }
896
+ .min-h-\[300px\] {
897
+ min-height: 300px;
898
+ }
875
899
  .min-h-full {
876
900
  min-height: 100%;
877
901
  }
@@ -1004,6 +1028,12 @@
1004
1028
  .w-\[calc\(100vw-1rem\)\] {
1005
1029
  width: calc(100vw - 1rem);
1006
1030
  }
1031
+ .w-\[min\(28rem\,calc\(100vw-2rem\)\)\] {
1032
+ width: min(28rem, calc(100vw - 2rem));
1033
+ }
1034
+ .w-\[var\(--radix-popover-trigger-width\)\] {
1035
+ width: var(--radix-popover-trigger-width);
1036
+ }
1007
1037
  .w-auto {
1008
1038
  width: auto;
1009
1039
  }
@@ -1130,6 +1160,9 @@
1130
1160
  .min-w-\[160px\] {
1131
1161
  min-width: 160px;
1132
1162
  }
1163
+ .min-w-\[200px\] {
1164
+ min-width: 200px;
1165
+ }
1133
1166
  .min-w-\[var\(--radix-select-trigger-width\)\] {
1134
1167
  min-width: var(--radix-select-trigger-width);
1135
1168
  }
@@ -1142,9 +1175,15 @@
1142
1175
  .flex-shrink-0 {
1143
1176
  flex-shrink: 0;
1144
1177
  }
1178
+ .shrink {
1179
+ flex-shrink: 1;
1180
+ }
1145
1181
  .shrink-0 {
1146
1182
  flex-shrink: 0;
1147
1183
  }
1184
+ .flex-grow {
1185
+ flex-grow: 1;
1186
+ }
1148
1187
  .grow {
1149
1188
  flex-grow: 1;
1150
1189
  }
@@ -1189,6 +1228,9 @@
1189
1228
  .origin-\[--radix-\.\.\.\] {
1190
1229
  transform-origin: --radix-...;
1191
1230
  }
1231
+ .origin-\[--radix-…\] {
1232
+ transform-origin: --radix-…;
1233
+ }
1192
1234
  .-translate-x-1\/2 {
1193
1235
  --tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
1194
1236
  translate: var(--tw-translate-x) var(--tw-translate-y);
@@ -1478,6 +1520,9 @@
1478
1520
  margin-inline-start: calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));
1479
1521
  margin-inline-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)));
1480
1522
  }
1523
+ .gap-y-0\.5 {
1524
+ row-gap: calc(var(--spacing) * 0.5);
1525
+ }
1481
1526
  .gap-y-1\.5 {
1482
1527
  row-gap: calc(var(--spacing) * 1.5);
1483
1528
  }
@@ -1630,6 +1675,12 @@
1630
1675
  .border-amber-300 {
1631
1676
  border-color: var(--color-amber-300);
1632
1677
  }
1678
+ .border-amber-300\/70 {
1679
+ border-color: color-mix(in srgb, oklch(87.9% 0.169 91.605) 70%, transparent);
1680
+ @supports (color: color-mix(in lab, red, red)) {
1681
+ border-color: color-mix(in oklab, var(--color-amber-300) 70%, transparent);
1682
+ }
1683
+ }
1633
1684
  .border-amber-400\/40 {
1634
1685
  border-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 40%, transparent);
1635
1686
  @supports (color: color-mix(in lab, red, red)) {
@@ -1678,6 +1729,12 @@
1678
1729
  border-color: color-mix(in oklab, var(--color-destructive) 50%, transparent);
1679
1730
  }
1680
1731
  }
1732
+ .border-emerald-300\/70 {
1733
+ border-color: color-mix(in srgb, oklch(84.5% 0.143 164.978) 70%, transparent);
1734
+ @supports (color: color-mix(in lab, red, red)) {
1735
+ border-color: color-mix(in oklab, var(--color-emerald-300) 70%, transparent);
1736
+ }
1737
+ }
1681
1738
  .border-gray-300 {
1682
1739
  border-color: var(--color-gray-300);
1683
1740
  }
@@ -1795,6 +1852,9 @@
1795
1852
  background-color: color-mix(in oklab, var(--color-destructive) 10%, transparent);
1796
1853
  }
1797
1854
  }
1855
+ .bg-emerald-50 {
1856
+ background-color: var(--color-emerald-50);
1857
+ }
1798
1858
  .bg-emerald-100 {
1799
1859
  background-color: var(--color-emerald-100);
1800
1860
  }
@@ -2259,6 +2319,9 @@
2259
2319
  .text-accent-foreground {
2260
2320
  color: var(--color-accent-foreground);
2261
2321
  }
2322
+ .text-amber-600 {
2323
+ color: var(--color-amber-600);
2324
+ }
2262
2325
  .text-amber-700 {
2263
2326
  color: var(--color-amber-700);
2264
2327
  }
@@ -2292,6 +2355,9 @@
2292
2355
  .text-emerald-700 {
2293
2356
  color: var(--color-emerald-700);
2294
2357
  }
2358
+ .text-emerald-900 {
2359
+ color: var(--color-emerald-900);
2360
+ }
2295
2361
  .text-foreground {
2296
2362
  color: var(--color-foreground);
2297
2363
  }
@@ -2614,6 +2680,10 @@
2614
2680
  --tw-outline-style: none;
2615
2681
  outline-style: none;
2616
2682
  }
2683
+ .select-all {
2684
+ -webkit-user-select: all;
2685
+ user-select: all;
2686
+ }
2617
2687
  .select-none {
2618
2688
  -webkit-user-select: none;
2619
2689
  user-select: none;
@@ -2663,6 +2733,9 @@
2663
2733
  .fade-in-80 {
2664
2734
  --tw-enter-opacity: 0.8;
2665
2735
  }
2736
+ .paused {
2737
+ animation-play-state: paused;
2738
+ }
2666
2739
  .ring-inset {
2667
2740
  --tw-ring-inset: inset;
2668
2741
  }
@@ -3357,6 +3430,34 @@
3357
3430
  .aria-selected\:text-muted-foreground[aria-selected="true"] {
3358
3431
  color: var(--color-muted-foreground);
3359
3432
  }
3433
+ .aria-\[orientation\=horizontal\]\:h-px[aria-orientation="horizontal"] {
3434
+ height: 1px;
3435
+ }
3436
+ .aria-\[orientation\=horizontal\]\:w-full[aria-orientation="horizontal"] {
3437
+ width: 100%;
3438
+ }
3439
+ .aria-\[orientation\=horizontal\]\:after\:left-0[aria-orientation="horizontal"]::after {
3440
+ content: var(--tw-content);
3441
+ left: 0px;
3442
+ }
3443
+ .aria-\[orientation\=horizontal\]\:after\:h-1[aria-orientation="horizontal"]::after {
3444
+ content: var(--tw-content);
3445
+ height: var(--spacing);
3446
+ }
3447
+ .aria-\[orientation\=horizontal\]\:after\:w-full[aria-orientation="horizontal"]::after {
3448
+ content: var(--tw-content);
3449
+ width: 100%;
3450
+ }
3451
+ .aria-\[orientation\=horizontal\]\:after\:translate-x-0[aria-orientation="horizontal"]::after {
3452
+ content: var(--tw-content);
3453
+ --tw-translate-x: 0px;
3454
+ translate: var(--tw-translate-x) var(--tw-translate-y);
3455
+ }
3456
+ .aria-\[orientation\=horizontal\]\:after\:-translate-y-1\/2[aria-orientation="horizontal"]::after {
3457
+ content: var(--tw-content);
3458
+ --tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
3459
+ translate: var(--tw-translate-x) var(--tw-translate-y);
3460
+ }
3360
3461
  .data-\[active\=true\]\:bg-sidebar-accent[data-active="true"] {
3361
3462
  background-color: var(--color-sidebar-accent);
3362
3463
  }
@@ -3418,37 +3519,6 @@
3418
3519
  .data-\[orientation\=vertical\]\:h-auto[data-orientation="vertical"] {
3419
3520
  height: auto;
3420
3521
  }
3421
- .data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction="vertical"] {
3422
- height: 1px;
3423
- }
3424
- .data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction="vertical"] {
3425
- width: 100%;
3426
- }
3427
- .data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction="vertical"] {
3428
- flex-direction: column;
3429
- }
3430
- .data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction="vertical"]::after {
3431
- content: var(--tw-content);
3432
- left: 0px;
3433
- }
3434
- .data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction="vertical"]::after {
3435
- content: var(--tw-content);
3436
- height: var(--spacing);
3437
- }
3438
- .data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction="vertical"]::after {
3439
- content: var(--tw-content);
3440
- width: 100%;
3441
- }
3442
- .data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction="vertical"]::after {
3443
- content: var(--tw-content);
3444
- --tw-translate-x: 0px;
3445
- translate: var(--tw-translate-x) var(--tw-translate-y);
3446
- }
3447
- .data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction="vertical"]::after {
3448
- content: var(--tw-content);
3449
- --tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
3450
- translate: var(--tw-translate-x) var(--tw-translate-y);
3451
- }
3452
3522
  .data-\[placeholder\]\:text-muted-foreground[data-placeholder] {
3453
3523
  color: var(--color-muted-foreground);
3454
3524
  }
@@ -3535,6 +3605,9 @@
3535
3605
  .data-\[state\=active\]\:bg-transparent[data-state="active"] {
3536
3606
  background-color: transparent;
3537
3607
  }
3608
+ .data-\[state\=active\]\:text-destructive[data-state="active"] {
3609
+ color: var(--color-destructive);
3610
+ }
3538
3611
  .data-\[state\=active\]\:text-foreground[data-state="active"] {
3539
3612
  color: var(--color-foreground);
3540
3613
  }
@@ -3614,6 +3687,9 @@
3614
3687
  .data-\[state\=hidden\]\:fade-out[data-state="hidden"] {
3615
3688
  --tw-exit-opacity: 0;
3616
3689
  }
3690
+ .data-\[state\=inactive\]\:hidden[data-state="inactive"] {
3691
+ display: none;
3692
+ }
3617
3693
  .data-\[state\=on\]\:bg-accent[data-state="on"] {
3618
3694
  background-color: var(--color-accent);
3619
3695
  }
@@ -3818,9 +3894,18 @@
3818
3894
  .motion-safe\:duration-300 {
3819
3895
  animation-duration: 300ms;
3820
3896
  }
3897
+ .motion-safe\:fade-in {
3898
+ --tw-enter-opacity: 0;
3899
+ }
3821
3900
  .motion-safe\:fade-in-0 {
3822
3901
  --tw-enter-opacity: 0;
3823
3902
  }
3903
+ .motion-safe\:slide-in-from-bottom-4 {
3904
+ --tw-enter-translate-y: 1rem;
3905
+ }
3906
+ .motion-safe\:slide-in-from-top-4 {
3907
+ --tw-enter-translate-y: -1rem;
3908
+ }
3824
3909
  .motion-safe\:zoom-in-95 {
3825
3910
  --tw-enter-scale: .95;
3826
3911
  }
@@ -4456,12 +4541,24 @@
4456
4541
  grid-column: span 4 / span 4;
4457
4542
  }
4458
4543
  }
4544
+ .dark\:border-amber-700\/60:where(.dark, .dark *) {
4545
+ border-color: color-mix(in srgb, oklch(55.5% 0.163 48.998) 60%, transparent);
4546
+ @supports (color: color-mix(in lab, red, red)) {
4547
+ border-color: color-mix(in oklab, var(--color-amber-700) 60%, transparent);
4548
+ }
4549
+ }
4459
4550
  .dark\:border-amber-900:where(.dark, .dark *) {
4460
4551
  border-color: var(--color-amber-900);
4461
4552
  }
4462
4553
  .dark\:border-destructive:where(.dark, .dark *) {
4463
4554
  border-color: var(--color-destructive);
4464
4555
  }
4556
+ .dark\:border-emerald-700\/60:where(.dark, .dark *) {
4557
+ border-color: color-mix(in srgb, oklch(50.8% 0.118 165.612) 60%, transparent);
4558
+ @supports (color: color-mix(in lab, red, red)) {
4559
+ border-color: color-mix(in oklab, var(--color-emerald-700) 60%, transparent);
4560
+ }
4561
+ }
4465
4562
  .dark\:bg-amber-950\/20:where(.dark, .dark *) {
4466
4563
  background-color: color-mix(in srgb, oklch(27.9% 0.077 45.635) 20%, transparent);
4467
4564
  @supports (color: color-mix(in lab, red, red)) {
@@ -4474,6 +4571,12 @@
4474
4571
  background-color: color-mix(in oklab, var(--color-amber-950) 30%, transparent);
4475
4572
  }
4476
4573
  }
4574
+ .dark\:bg-amber-950\/40:where(.dark, .dark *) {
4575
+ background-color: color-mix(in srgb, oklch(27.9% 0.077 45.635) 40%, transparent);
4576
+ @supports (color: color-mix(in lab, red, red)) {
4577
+ background-color: color-mix(in oklab, var(--color-amber-950) 40%, transparent);
4578
+ }
4579
+ }
4477
4580
  .dark\:bg-background\/95:where(.dark, .dark *) {
4478
4581
  background-color: color-mix(in srgb, hsl(var(--background)) 95%, transparent);
4479
4582
  @supports (color: color-mix(in lab, red, red)) {
@@ -4486,6 +4589,12 @@
4486
4589
  background-color: color-mix(in oklab, var(--color-destructive) 15%, transparent);
4487
4590
  }
4488
4591
  }
4592
+ .dark\:bg-emerald-950\/40:where(.dark, .dark *) {
4593
+ background-color: color-mix(in srgb, oklch(26.2% 0.051 172.552) 40%, transparent);
4594
+ @supports (color: color-mix(in lab, red, red)) {
4595
+ background-color: color-mix(in oklab, var(--color-emerald-950) 40%, transparent);
4596
+ }
4597
+ }
4489
4598
  .dark\:bg-emerald-950\/50:where(.dark, .dark *) {
4490
4599
  background-color: color-mix(in srgb, oklch(26.2% 0.051 172.552) 50%, transparent);
4491
4600
  @supports (color: color-mix(in lab, red, red)) {
@@ -4501,6 +4610,12 @@
4501
4610
  .dark\:text-amber-400:where(.dark, .dark *) {
4502
4611
  color: var(--color-amber-400);
4503
4612
  }
4613
+ .dark\:text-destructive-foreground:where(.dark, .dark *) {
4614
+ color: var(--color-destructive-foreground);
4615
+ }
4616
+ .dark\:text-emerald-200:where(.dark, .dark *) {
4617
+ color: var(--color-emerald-200);
4618
+ }
4504
4619
  .dark\:text-emerald-400:where(.dark, .dark *) {
4505
4620
  color: var(--color-emerald-400);
4506
4621
  }
@@ -4832,7 +4947,7 @@
4832
4947
  border-bottom-style: var(--tw-border-style);
4833
4948
  border-bottom-width: 0px;
4834
4949
  }
4835
- .\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical] > div {
4950
+ .\[\&\[aria-orientation\=horizontal\]\>div\]\:rotate-90[aria-orientation=horizontal] > div {
4836
4951
  rotate: 90deg;
4837
4952
  }
4838
4953
  .\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open] > svg {
package/dist/index.d.ts CHANGED
@@ -1,11 +1,13 @@
1
1
  export { cn } from './lib/utils';
2
2
  export { renderChildren } from './lib/utils';
3
3
  export { cva } from 'class-variance-authority';
4
- export { getLazyIcon, LazyIcon, toKebabIconName } from './lib/lazy-icon';
4
+ export { getLazyIcon, isLucideIconName, LazyIcon, toKebabIconName } from './lib/lazy-icon';
5
5
  export { registerPlaceholders } from './renderers/placeholders';
6
6
  export { GridFieldAuthoringProvider, useGridFieldAuthoring, type GridFieldAuthoring, } from './context/gridFieldAuthoring';
7
7
  export * from './ui';
8
8
  export * from './custom';
9
+ export * from './notifications';
10
+ export { TOASTER_POSITIONS } from './renderers/feedback/toaster';
9
11
  export { useConfigDraft } from './hooks/use-config-draft';
10
12
  export type { UseConfigDraftOptions, UseConfigDraftReturn } from './hooks/use-config-draft';
11
13
  export { useIsMobile } from './hooks/use-mobile';