@deepfuture/dui-components 1.2.1 → 1.4.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/all.d.ts CHANGED
@@ -37,13 +37,16 @@ import "./sidebar/index.js";
37
37
  import "./slider/index.js";
38
38
  import "./spinner/index.js";
39
39
  import "./split-button/index.js";
40
+ import "./splitter/index.js";
40
41
  import "./stepper/index.js";
41
42
  import "./switch/index.js";
42
43
  import "./tabs/index.js";
43
44
  import "./textarea/index.js";
45
+ import "./toast/index.js";
44
46
  import "./toggle/index.js";
45
47
  import "./toolbar/index.js";
46
48
  import "./tooltip/index.js";
49
+ import "./tree/index.js";
47
50
  import "./trunc/index.js";
48
51
  export { DuiAccordion } from "./accordion/index.js";
49
52
  export { DuiAccordionItem } from "./accordion/index.js";
@@ -119,6 +122,9 @@ export { DuiSidebarTrigger } from "./sidebar/index.js";
119
122
  export { DuiSlider } from "./slider/index.js";
120
123
  export { DuiSpinner } from "./spinner/index.js";
121
124
  export { DuiSplitButton } from "./split-button/index.js";
125
+ export { DuiSplitter } from "./splitter/index.js";
126
+ export { DuiSplitterHandle } from "./splitter/index.js";
127
+ export { DuiSplitterPanel } from "./splitter/index.js";
122
128
  export { DuiStepper } from "./stepper/index.js";
123
129
  export { DuiSwitch } from "./switch/index.js";
124
130
  export { DuiTab } from "./tabs/index.js";
@@ -127,12 +133,15 @@ export { DuiTabsIndicator } from "./tabs/index.js";
127
133
  export { DuiTabsList } from "./tabs/index.js";
128
134
  export { DuiTabsPanel } from "./tabs/index.js";
129
135
  export { DuiTextarea } from "./textarea/index.js";
136
+ export { DuiToast, DuiToastAction, DuiToastClose, DuiToastRegion, toast, } from "./toast/index.js";
130
137
  export { DuiToggle } from "./toggle/index.js";
131
138
  export { DuiToggleGroup } from "./toggle/index.js";
132
139
  export { DuiToolbar } from "./toolbar/index.js";
133
140
  export { DuiTooltip } from "./tooltip/index.js";
134
141
  export { DuiTooltipPopup } from "./tooltip/index.js";
135
142
  export { DuiTooltipTrigger } from "./tooltip/index.js";
143
+ export { DuiTree } from "./tree/index.js";
144
+ export { DuiTreeItem } from "./tree/index.js";
136
145
  export { DuiTrunc } from "./trunc/index.js";
137
146
  export type { AccordionContext } from "@deepfuture/dui-primitives/accordion";
138
147
  export type { AlertDialogOpenChangeDetail } from "@deepfuture/dui-primitives/alert-dialog";
@@ -154,8 +163,10 @@ export type { PreviewCardContext, PreviewCardSide } from "@deepfuture/dui-primit
154
163
  export type { RadioGroupContext } from "@deepfuture/dui-primitives/radio";
155
164
  export type { SidebarOpenChangeDetail } from "@deepfuture/dui-primitives/sidebar";
156
165
  export type { SidebarContext } from "@deepfuture/dui-primitives/sidebar";
166
+ export type { SplitterContext, SplitterHandleAria, SplitterHandleMeta, SplitterPanelMeta } from "@deepfuture/dui-primitives/splitter";
157
167
  export type { TabsContext } from "@deepfuture/dui-primitives/tabs";
158
168
  export type { TextareaResize } from "@deepfuture/dui-primitives/textarea";
159
169
  export type { ToggleGroupContext } from "@deepfuture/dui-primitives/toggle";
160
170
  export type { TooltipOpenChangeDetail } from "@deepfuture/dui-primitives/tooltip";
161
171
  export type { TooltipContext, TooltipSide } from "@deepfuture/dui-primitives/tooltip";
172
+ export type { SelectionMode, TreeContext } from "@deepfuture/dui-primitives/tree";
package/all.js CHANGED
@@ -37,13 +37,16 @@ import "./sidebar/index.js";
37
37
  import "./slider/index.js";
38
38
  import "./spinner/index.js";
39
39
  import "./split-button/index.js";
40
+ import "./splitter/index.js";
40
41
  import "./stepper/index.js";
41
42
  import "./switch/index.js";
42
43
  import "./tabs/index.js";
43
44
  import "./textarea/index.js";
45
+ import "./toast/index.js";
44
46
  import "./toggle/index.js";
45
47
  import "./toolbar/index.js";
46
48
  import "./tooltip/index.js";
49
+ import "./tree/index.js";
47
50
  import "./trunc/index.js";
48
51
  export { DuiAccordion } from "./accordion/index.js";
49
52
  export { DuiAccordionItem } from "./accordion/index.js";
@@ -119,6 +122,9 @@ export { DuiSidebarTrigger } from "./sidebar/index.js";
119
122
  export { DuiSlider } from "./slider/index.js";
120
123
  export { DuiSpinner } from "./spinner/index.js";
121
124
  export { DuiSplitButton } from "./split-button/index.js";
125
+ export { DuiSplitter } from "./splitter/index.js";
126
+ export { DuiSplitterHandle } from "./splitter/index.js";
127
+ export { DuiSplitterPanel } from "./splitter/index.js";
122
128
  export { DuiStepper } from "./stepper/index.js";
123
129
  export { DuiSwitch } from "./switch/index.js";
124
130
  export { DuiTab } from "./tabs/index.js";
@@ -127,10 +133,13 @@ export { DuiTabsIndicator } from "./tabs/index.js";
127
133
  export { DuiTabsList } from "./tabs/index.js";
128
134
  export { DuiTabsPanel } from "./tabs/index.js";
129
135
  export { DuiTextarea } from "./textarea/index.js";
136
+ export { DuiToast, DuiToastAction, DuiToastClose, DuiToastRegion, toast, } from "./toast/index.js";
130
137
  export { DuiToggle } from "./toggle/index.js";
131
138
  export { DuiToggleGroup } from "./toggle/index.js";
132
139
  export { DuiToolbar } from "./toolbar/index.js";
133
140
  export { DuiTooltip } from "./tooltip/index.js";
134
141
  export { DuiTooltipPopup } from "./tooltip/index.js";
135
142
  export { DuiTooltipTrigger } from "./tooltip/index.js";
143
+ export { DuiTree } from "./tree/index.js";
144
+ export { DuiTreeItem } from "./tree/index.js";
136
145
  export { DuiTrunc } from "./trunc/index.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deepfuture/dui-components",
3
- "version": "1.2.1",
3
+ "version": "1.4.0",
4
4
  "description": "DUI styled web components — extends dui-primitives with design tokens and variant CSS",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -154,6 +154,10 @@
154
154
  "import": "./split-button/index.js",
155
155
  "types": "./split-button/index.d.ts"
156
156
  },
157
+ "./splitter": {
158
+ "import": "./splitter/index.js",
159
+ "types": "./splitter/index.d.ts"
160
+ },
157
161
  "./stepper": {
158
162
  "import": "./stepper/index.js",
159
163
  "types": "./stepper/index.d.ts"
@@ -174,6 +178,10 @@
174
178
  "import": "./theme/index.js",
175
179
  "types": "./theme/index.d.ts"
176
180
  },
181
+ "./toast": {
182
+ "import": "./toast/index.js",
183
+ "types": "./toast/index.d.ts"
184
+ },
177
185
  "./toggle": {
178
186
  "import": "./toggle/index.js",
179
187
  "types": "./toggle/index.d.ts"
@@ -186,6 +194,10 @@
186
194
  "import": "./tooltip/index.js",
187
195
  "types": "./tooltip/index.d.ts"
188
196
  },
197
+ "./tree": {
198
+ "import": "./tree/index.js",
199
+ "types": "./tree/index.d.ts"
200
+ },
189
201
  "./tokens": {
190
202
  "import": "./tokens/tokens.js",
191
203
  "types": "./tokens/tokens.d.ts"
@@ -210,7 +222,7 @@
210
222
  "README.md"
211
223
  ],
212
224
  "dependencies": {
213
- "@deepfuture/dui-primitives": "1.1.0",
225
+ "@deepfuture/dui-primitives": "1.6.0",
214
226
  "lit": "^3.3.2",
215
227
  "@lit/context": "^1.1.3"
216
228
  },
@@ -0,0 +1,8 @@
1
+ import "./splitter.js";
2
+ import "./splitter-panel.js";
3
+ import "./splitter-handle.js";
4
+ export { DuiSplitter } from "./splitter.js";
5
+ export { DuiSplitterPanel } from "./splitter-panel.js";
6
+ export { DuiSplitterHandle } from "./splitter-handle.js";
7
+ export type { SplitterContext, SplitterHandleAria, SplitterHandleMeta, SplitterPanelMeta, } from "@deepfuture/dui-primitives/splitter";
8
+ export { collapseChangeEvent, valueChangeEvent } from "@deepfuture/dui-primitives/splitter";
@@ -0,0 +1,7 @@
1
+ import "./splitter.js";
2
+ import "./splitter-panel.js";
3
+ import "./splitter-handle.js";
4
+ export { DuiSplitter } from "./splitter.js";
5
+ export { DuiSplitterPanel } from "./splitter-panel.js";
6
+ export { DuiSplitterHandle } from "./splitter-handle.js";
7
+ export { collapseChangeEvent, valueChangeEvent } from "@deepfuture/dui-primitives/splitter";
@@ -0,0 +1,24 @@
1
+ import { DuiSplitterHandlePrimitive } from "@deepfuture/dui-primitives/splitter";
2
+ import "../_install.js";
3
+ /**
4
+ * `<dui-splitter-handle>` — Styled draggable separator.
5
+ *
6
+ * Default appearance: 8px interaction target with a centered 1px line that
7
+ * brightens on hover and turns accent-colored when dragged or keyboard-focused.
8
+ *
9
+ * Customize via CSS vars on the handle, the splitter, or any ancestor:
10
+ *
11
+ * ```css
12
+ * .my-splitter {
13
+ * --splitter-handle-size: 12px; // interaction target thickness
14
+ * --splitter-handle-visible-size: 0; // invisible bar with a fat target
15
+ * --splitter-handle-color: var(--border);
16
+ * --splitter-handle-hover-color: var(--border-strong);
17
+ * --splitter-handle-active-color: var(--accent);
18
+ * --splitter-handle-radius: var(--radius-full);
19
+ * }
20
+ * ```
21
+ */
22
+ export declare class DuiSplitterHandle extends DuiSplitterHandlePrimitive {
23
+ static styles: import("lit").CSSResult[];
24
+ }
@@ -0,0 +1,113 @@
1
+ import { css } from "lit";
2
+ import { DuiSplitterHandlePrimitive } from "@deepfuture/dui-primitives/splitter";
3
+ import "../_install.js";
4
+ /**
5
+ * Two-layer handle styling:
6
+ *
7
+ * • The host element is the **interaction target**. Its cross-axis size
8
+ * (--splitter-handle-size) defines how easy the handle is to grab.
9
+ * • A ::before pseudo on [part="root"] draws the **visible line**, centered
10
+ * in the target, with its own thickness (--splitter-handle-visible-size).
11
+ *
12
+ * This decouples hit area from drawn width — set the visible line to 1px
13
+ * (or 0 for an invisible-but-grabbable handle) while keeping a fat 8px+
14
+ * target.
15
+ *
16
+ * Defaults are applied via `var(name, fallback)` at every consumption site
17
+ * rather than via a `:host { --x: default }` declarations block. The latter
18
+ * sets the value *directly* on the host element, which silently overrides
19
+ * any value the consumer inherits down from an ancestor (e.g. a wrapper
20
+ * with `.fat-handles { --splitter-handle-size: 16px }`). The fallback
21
+ * pattern keeps every var overridable from anywhere in the cascade.
22
+ */
23
+ const styles = css `
24
+ /* Host = interaction target. Cross-axis size depends on orientation. */
25
+ :host([data-orientation="horizontal"]) {
26
+ width: var(--splitter-handle-size, var(--space-2));
27
+ }
28
+ :host([data-orientation="vertical"]) {
29
+ height: var(--splitter-handle-size, var(--space-2));
30
+ }
31
+
32
+ [part="root"] {
33
+ position: relative;
34
+ display: flex;
35
+ align-items: center;
36
+ justify-content: center;
37
+ }
38
+
39
+ /* Visible line — centered in the interaction target. */
40
+ [part="root"]::before {
41
+ content: "";
42
+ display: block;
43
+ background: var(--splitter-handle-color, var(--border));
44
+ border-radius: var(--splitter-handle-radius, var(--radius-full));
45
+ transition:
46
+ background-color var(--splitter-handle-transition-duration, var(--duration-fast)) ease,
47
+ width var(--splitter-handle-transition-duration, var(--duration-fast)) ease,
48
+ height var(--splitter-handle-transition-duration, var(--duration-fast)) ease;
49
+ }
50
+
51
+ :host([data-orientation="horizontal"]) [part="root"]::before {
52
+ width: var(--splitter-handle-visible-size, var(--border-width-thin));
53
+ height: 100%;
54
+ }
55
+ :host([data-orientation="vertical"]) [part="root"]::before {
56
+ width: 100%;
57
+ height: var(--splitter-handle-visible-size, var(--border-width-thin));
58
+ }
59
+
60
+ /* Hover — brighten the line. :where(:hover) keeps the specificity at
61
+ (0,1,0) so the dragging rule below can win the tie via source order;
62
+ otherwise hovering during a drag would override the active color. */
63
+ :host(:where(:hover):not([data-disabled])) [part="root"]::before {
64
+ background: var(--splitter-handle-hover-color, var(--border-strong));
65
+ }
66
+
67
+ /* Active states. The primitive defaultPrevents focus-on-mousedown so
68
+ pointer clicks no longer steal focus — [data-focused] reflects keyboard
69
+ focus only, matching :focus-visible semantics. */
70
+ :host([data-dragging]) [part="root"]::before,
71
+ :host([data-focused]) [part="root"]::before {
72
+ background: var(--splitter-handle-active-color, var(--accent));
73
+ }
74
+
75
+ /* Keyboard focus also fattens the line so the active state is unambiguous
76
+ even when --splitter-handle-visible-size is 0. The combined attribute
77
+ selector beats the orientation-specific size rule above on specificity. */
78
+ :host([data-orientation="horizontal"][data-focused]) [part="root"]::before {
79
+ width: var(--space-1);
80
+ }
81
+ :host([data-orientation="vertical"][data-focused]) [part="root"]::before {
82
+ height: var(--space-1);
83
+ }
84
+
85
+ /* Disabled — mute the bar. */
86
+ :host([data-disabled]) [part="root"]::before {
87
+ background: var(--border);
88
+ opacity: 0.5;
89
+ }
90
+ `;
91
+ /**
92
+ * `<dui-splitter-handle>` — Styled draggable separator.
93
+ *
94
+ * Default appearance: 8px interaction target with a centered 1px line that
95
+ * brightens on hover and turns accent-colored when dragged or keyboard-focused.
96
+ *
97
+ * Customize via CSS vars on the handle, the splitter, or any ancestor:
98
+ *
99
+ * ```css
100
+ * .my-splitter {
101
+ * --splitter-handle-size: 12px; // interaction target thickness
102
+ * --splitter-handle-visible-size: 0; // invisible bar with a fat target
103
+ * --splitter-handle-color: var(--border);
104
+ * --splitter-handle-hover-color: var(--border-strong);
105
+ * --splitter-handle-active-color: var(--accent);
106
+ * --splitter-handle-radius: var(--radius-full);
107
+ * }
108
+ * ```
109
+ */
110
+ export class DuiSplitterHandle extends DuiSplitterHandlePrimitive {
111
+ static styles = [...DuiSplitterHandlePrimitive.styles, styles];
112
+ }
113
+ customElements.define(DuiSplitterHandle.tagName, DuiSplitterHandle);
@@ -0,0 +1,11 @@
1
+ import { DuiSplitterPanelPrimitive } from "@deepfuture/dui-primitives/splitter";
2
+ import "../_install.js";
3
+ /**
4
+ * `<dui-splitter-panel>` — A single resizable panel.
5
+ *
6
+ * The host owns `flex-basis` (set inline by the parent splitter); consumers
7
+ * paint content onto `::part(root)`. No default aesthetic styling — panels
8
+ * are content surfaces and should adopt the surrounding application's look.
9
+ */
10
+ export declare class DuiSplitterPanel extends DuiSplitterPanelPrimitive {
11
+ }
@@ -0,0 +1,12 @@
1
+ import { DuiSplitterPanelPrimitive } from "@deepfuture/dui-primitives/splitter";
2
+ import "../_install.js";
3
+ /**
4
+ * `<dui-splitter-panel>` — A single resizable panel.
5
+ *
6
+ * The host owns `flex-basis` (set inline by the parent splitter); consumers
7
+ * paint content onto `::part(root)`. No default aesthetic styling — panels
8
+ * are content surfaces and should adopt the surrounding application's look.
9
+ */
10
+ export class DuiSplitterPanel extends DuiSplitterPanelPrimitive {
11
+ }
12
+ customElements.define(DuiSplitterPanel.tagName, DuiSplitterPanel);
@@ -0,0 +1,11 @@
1
+ import { DuiSplitterPrimitive } from "@deepfuture/dui-primitives/splitter";
2
+ import "../_install.js";
3
+ /**
4
+ * `<dui-splitter>` — Resizable panel group.
5
+ *
6
+ * The root element is layout-only; all aesthetic styling lives on
7
+ * `<dui-splitter-handle>` and (optionally) on each `<dui-splitter-panel>`'s
8
+ * `::part(root)` content surface.
9
+ */
10
+ export declare class DuiSplitter extends DuiSplitterPrimitive {
11
+ }
@@ -0,0 +1,12 @@
1
+ import { DuiSplitterPrimitive } from "@deepfuture/dui-primitives/splitter";
2
+ import "../_install.js";
3
+ /**
4
+ * `<dui-splitter>` — Resizable panel group.
5
+ *
6
+ * The root element is layout-only; all aesthetic styling lives on
7
+ * `<dui-splitter-handle>` and (optionally) on each `<dui-splitter-panel>`'s
8
+ * `::part(root)` content surface.
9
+ */
10
+ export class DuiSplitter extends DuiSplitterPrimitive {
11
+ }
12
+ customElements.define(DuiSplitter.tagName, DuiSplitter);
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Default icon templates for `<dui-toast>`, keyed by `data-type`.
3
+ *
4
+ * SVGs are sized to 14×16 with `currentColor` so they inherit the toast's
5
+ * `--toast-icon-color` (which resolves per-type via `--toast-type-color`).
6
+ *
7
+ * The `loading` type uses `<dui-spinner>` instead of an inline SVG for
8
+ * consistency with the rest of `@dui/components` (and free reduced-motion
9
+ * handling).
10
+ */
11
+ import { type TemplateResult } from "lit";
12
+ import type { ToastType } from "@deepfuture/dui-primitives/toast";
13
+ /**
14
+ * Returns the default icon template for a given toast type, or `null` if the
15
+ * type doesn't ship with a built-in icon (`default`, or any unknown value).
16
+ */
17
+ export declare function defaultIconFor(type: ToastType): TemplateResult | null;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Default icon templates for `<dui-toast>`, keyed by `data-type`.
3
+ *
4
+ * SVGs are sized to 14×16 with `currentColor` so they inherit the toast's
5
+ * `--toast-icon-color` (which resolves per-type via `--toast-type-color`).
6
+ *
7
+ * The `loading` type uses `<dui-spinner>` instead of an inline SVG for
8
+ * consistency with the rest of `@dui/components` (and free reduced-motion
9
+ * handling).
10
+ */
11
+ import { html } from "lit";
12
+ const success = html `
13
+ <svg viewBox="0 0 16 16" width="14" height="14" aria-hidden="true">
14
+ <path
15
+ d="M3 8.5l3 3 6.5-7"
16
+ fill="none"
17
+ stroke="currentColor"
18
+ stroke-width="2"
19
+ stroke-linecap="round"
20
+ stroke-linejoin="round"
21
+ />
22
+ </svg>
23
+ `;
24
+ const error = html `
25
+ <svg viewBox="0 0 16 16" width="14" height="14" aria-hidden="true">
26
+ <path
27
+ d="M4 4l8 8M12 4l-8 8"
28
+ fill="none"
29
+ stroke="currentColor"
30
+ stroke-width="2"
31
+ stroke-linecap="round"
32
+ />
33
+ </svg>
34
+ `;
35
+ const warning = html `
36
+ <svg viewBox="0 0 16 16" width="14" height="14" aria-hidden="true">
37
+ <path
38
+ d="M8 1.5L14.5 13.5h-13z"
39
+ fill="none"
40
+ stroke="currentColor"
41
+ stroke-width="2"
42
+ stroke-linejoin="round"
43
+ />
44
+ <path
45
+ d="M8 6v3.5"
46
+ fill="none"
47
+ stroke="currentColor"
48
+ stroke-width="2"
49
+ stroke-linecap="round"
50
+ />
51
+ <circle cx="8" cy="11.5" r="0.9" fill="currentColor" />
52
+ </svg>
53
+ `;
54
+ const info = html `
55
+ <svg viewBox="0 0 16 16" width="14" height="14" aria-hidden="true">
56
+ <circle
57
+ cx="8"
58
+ cy="8"
59
+ r="6.5"
60
+ fill="none"
61
+ stroke="currentColor"
62
+ stroke-width="2"
63
+ />
64
+ <path
65
+ d="M8 7.5v4"
66
+ fill="none"
67
+ stroke="currentColor"
68
+ stroke-width="2"
69
+ stroke-linecap="round"
70
+ />
71
+ <circle cx="8" cy="4.7" r="0.9" fill="currentColor" />
72
+ </svg>
73
+ `;
74
+ const loading = html `
75
+ <dui-spinner part="spinner" aria-hidden="true"></dui-spinner>
76
+ `;
77
+ /**
78
+ * Returns the default icon template for a given toast type, or `null` if the
79
+ * type doesn't ship with a built-in icon (`default`, or any unknown value).
80
+ */
81
+ export function defaultIconFor(type) {
82
+ switch (type) {
83
+ case "success":
84
+ return success;
85
+ case "error":
86
+ return error;
87
+ case "warning":
88
+ return warning;
89
+ case "info":
90
+ return info;
91
+ case "loading":
92
+ return loading;
93
+ default:
94
+ return null;
95
+ }
96
+ }
@@ -0,0 +1,12 @@
1
+ import "./toast-region.js";
2
+ import "./toast.js";
3
+ import "./toast-action.js";
4
+ import "./toast-close.js";
5
+ import { toast } from "@deepfuture/dui-primitives/toast";
6
+ export { DuiToastRegion } from "./toast-region.js";
7
+ export { DuiToast } from "./toast.js";
8
+ export { DuiToastAction } from "./toast-action.js";
9
+ export { DuiToastClose } from "./toast-close.js";
10
+ export { toast };
11
+ export type { PromiseMessages, ToastAction, ToastApi, ToastConfig, ToastDismissDetail, ToastDismissReason, ToastItemContext, ToastOpenChangeDetail, ToastOptions, ToastPosition, ToastPriority, ToastRegionContext, ToastType, } from "@deepfuture/dui-primitives/toast";
12
+ export { toastDismissEvent, toastOpenChangeEvent, toastRegionDismissEvent, } from "@deepfuture/dui-primitives/toast";
package/toast/index.js ADDED
@@ -0,0 +1,11 @@
1
+ import "./toast-region.js";
2
+ import "./toast.js";
3
+ import "./toast-action.js";
4
+ import "./toast-close.js";
5
+ import { toast } from "@deepfuture/dui-primitives/toast";
6
+ export { DuiToastRegion } from "./toast-region.js";
7
+ export { DuiToast } from "./toast.js";
8
+ export { DuiToastAction } from "./toast-action.js";
9
+ export { DuiToastClose } from "./toast-close.js";
10
+ export { toast };
11
+ export { toastDismissEvent, toastOpenChangeEvent, toastRegionDismissEvent, } from "@deepfuture/dui-primitives/toast";
@@ -0,0 +1,16 @@
1
+ import { DuiToastActionPrimitive } from "@deepfuture/dui-primitives/toast";
2
+ import "../_install.js";
3
+ /**
4
+ * `<dui-toast-action>` — Styled action button wrapper.
5
+ *
6
+ * Wraps a slotted button (typically an auto-created `<button>` from the
7
+ * imperative `toast()` facade, or a consumer-provided `<button>` /
8
+ * `<dui-button>`). Clicking the slotted control dismisses the toast with
9
+ * reason `"action"` (handled by the primitive).
10
+ *
11
+ * Bare `<button>` children are styled as a small filled neutral button.
12
+ * Slotted `<dui-button>` retains its own styling.
13
+ */
14
+ export declare class DuiToastAction extends DuiToastActionPrimitive {
15
+ static styles: import("lit").CSSResult[];
16
+ }
@@ -0,0 +1,52 @@
1
+ import { css } from "lit";
2
+ import { DuiToastActionPrimitive } from "@deepfuture/dui-primitives/toast";
3
+ import "../_install.js";
4
+ const styles = css `
5
+ /* Style any slotted <button> uniformly — works for both the imperative
6
+ facade's auto-created <button>s and consumer-slotted ones. Native
7
+ ::slotted() can't reach into shadow trees, but this targets light-DOM
8
+ children of <dui-toast-action>. */
9
+ ::slotted(button) {
10
+ font-family: var(--font-sans);
11
+ font-size: var(--text-xs);
12
+ font-weight: var(--font-weight-medium);
13
+ line-height: 1;
14
+ padding: var(--space-1_5) var(--space-2_5);
15
+ border: var(--border-width-thin) solid transparent;
16
+ border-radius: var(--radius-sm);
17
+ background: var(--foreground);
18
+ color: var(--background);
19
+ cursor: pointer;
20
+ transition:
21
+ background var(--duration-fast) var(--ease-out-3),
22
+ filter var(--duration-fast) var(--ease-out-3);
23
+ }
24
+
25
+ ::slotted(button:hover) {
26
+ filter: brightness(0.88);
27
+ }
28
+
29
+ ::slotted(button:active) {
30
+ filter: brightness(0.78);
31
+ }
32
+
33
+ ::slotted(button:focus-visible) {
34
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
35
+ outline-offset: var(--focus-ring-offset);
36
+ }
37
+ `;
38
+ /**
39
+ * `<dui-toast-action>` — Styled action button wrapper.
40
+ *
41
+ * Wraps a slotted button (typically an auto-created `<button>` from the
42
+ * imperative `toast()` facade, or a consumer-provided `<button>` /
43
+ * `<dui-button>`). Clicking the slotted control dismisses the toast with
44
+ * reason `"action"` (handled by the primitive).
45
+ *
46
+ * Bare `<button>` children are styled as a small filled neutral button.
47
+ * Slotted `<dui-button>` retains its own styling.
48
+ */
49
+ export class DuiToastAction extends DuiToastActionPrimitive {
50
+ static styles = [...DuiToastActionPrimitive.styles, styles];
51
+ }
52
+ customElements.define(DuiToastAction.tagName, DuiToastAction);
@@ -0,0 +1,16 @@
1
+ import { DuiToastClosePrimitive } from "@deepfuture/dui-primitives/toast";
2
+ import "../_install.js";
3
+ /**
4
+ * `<dui-toast-close>` — Styled close button wrapper.
5
+ *
6
+ * Wraps a slotted close control (typically an auto-created `<button>×</button>`
7
+ * from the imperative `toast()` facade, or a consumer-provided one). Clicking
8
+ * dismisses the toast with reason `"close"` (handled by the primitive).
9
+ *
10
+ * Bare `<button>` children are styled as a square ghost-icon button. The
11
+ * parent `<dui-toast>` controls visibility (hover-only on devices with
12
+ * hover, always visible on touch).
13
+ */
14
+ export declare class DuiToastClose extends DuiToastClosePrimitive {
15
+ static styles: import("lit").CSSResult[];
16
+ }
@@ -0,0 +1,52 @@
1
+ import { css } from "lit";
2
+ import { DuiToastClosePrimitive } from "@deepfuture/dui-primitives/toast";
3
+ import "../_install.js";
4
+ const styles = css `
5
+ /* Style any slotted <button> as a small ghost-icon close affordance.
6
+ Hover-to-show behavior lives on the parent <dui-toast> (close-wrapper
7
+ part); this just renders the button itself. */
8
+ ::slotted(button) {
9
+ font-family: var(--font-sans);
10
+ font-size: var(--text-xs);
11
+ line-height: 1;
12
+ width: var(--space-5);
13
+ height: var(--space-5);
14
+ display: inline-flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ padding: 0;
18
+ border: none;
19
+ border-radius: var(--radius-sm);
20
+ background: transparent;
21
+ color: var(--text-2);
22
+ cursor: pointer;
23
+ transition:
24
+ background var(--duration-fast) var(--ease-out-3),
25
+ color var(--duration-fast) var(--ease-out-3);
26
+ }
27
+
28
+ ::slotted(button:hover) {
29
+ background: oklch(from var(--foreground) l c h / 0.08);
30
+ color: var(--text-1);
31
+ }
32
+
33
+ ::slotted(button:focus-visible) {
34
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
35
+ outline-offset: var(--focus-ring-offset);
36
+ }
37
+ `;
38
+ /**
39
+ * `<dui-toast-close>` — Styled close button wrapper.
40
+ *
41
+ * Wraps a slotted close control (typically an auto-created `<button>×</button>`
42
+ * from the imperative `toast()` facade, or a consumer-provided one). Clicking
43
+ * dismisses the toast with reason `"close"` (handled by the primitive).
44
+ *
45
+ * Bare `<button>` children are styled as a square ghost-icon button. The
46
+ * parent `<dui-toast>` controls visibility (hover-only on devices with
47
+ * hover, always visible on touch).
48
+ */
49
+ export class DuiToastClose extends DuiToastClosePrimitive {
50
+ static styles = [...DuiToastClosePrimitive.styles, styles];
51
+ }
52
+ customElements.define(DuiToastClose.tagName, DuiToastClose);