@lattice-php/lattice 0.3.0 → 0.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/dist/chat/components/chat-box.js +1 -1
- package/dist/chat/components/chat-box.js.map +1 -1
- package/dist/chat/components/message.js +1 -1
- package/dist/chat/components/message.js.map +1 -1
- package/dist/chat/transport.d.ts +2 -0
- package/dist/chat/transport.js +23 -3
- package/dist/chat/transport.js.map +1 -1
- package/dist/core/api.d.ts +14 -7
- package/dist/core/api.js +77 -1
- package/dist/core/api.js.map +1 -1
- package/dist/core/components/badge.js +3 -3
- package/dist/core/components/badge.js.map +1 -1
- package/dist/core/components/button.js +15 -15
- package/dist/core/components/button.js.map +1 -1
- package/dist/core/components/card.js +1 -1
- package/dist/core/components/card.js.map +1 -1
- package/dist/core/components/chart.js +1 -1
- package/dist/core/components/chart.js.map +1 -1
- package/dist/core/components/checkbox.js +1 -1
- package/dist/core/components/checkbox.js.map +1 -1
- package/dist/core/components/control.js +4 -4
- package/dist/core/components/control.js.map +1 -1
- package/dist/core/components/dialog.d.ts +1 -1
- package/dist/core/components/dialog.js +2 -1
- package/dist/core/components/dialog.js.map +1 -1
- package/dist/core/components/floating-panel.js +2 -2
- package/dist/core/components/floating-panel.js.map +1 -1
- package/dist/core/components/heading.js +1 -1
- package/dist/core/components/heading.js.map +1 -1
- package/dist/core/components/popover.d.ts +1 -1
- package/dist/core/components/popover.js +1 -1
- package/dist/core/components/popover.js.map +1 -1
- package/dist/core/components/section.js +2 -2
- package/dist/core/components/section.js.map +1 -1
- package/dist/core/components/segmented-pills.js +1 -1
- package/dist/core/components/segmented-pills.js.map +1 -1
- package/dist/core/components/stack.js +7 -1
- package/dist/core/components/stack.js.map +1 -1
- package/dist/core/components/tabs.js +1 -1
- package/dist/core/components/tabs.js.map +1 -1
- package/dist/core/types.d.ts +3 -1
- package/dist/form/components/base/affix-group.d.ts +17 -0
- package/dist/form/components/base/affix-group.js +49 -0
- package/dist/form/components/base/affix-group.js.map +1 -0
- package/dist/form/components/base/label.js +1 -1
- package/dist/form/components/base/label.js.map +1 -1
- package/dist/form/components/base/submit-button.js +1 -1
- package/dist/form/components/base/submit-button.js.map +1 -1
- package/dist/form/components/base/textarea.js +1 -1
- package/dist/form/components/base/textarea.js.map +1 -1
- package/dist/form/components/fields/file-upload.js +34 -2
- package/dist/form/components/fields/file-upload.js.map +1 -1
- package/dist/form/components/fields/number-input.js +21 -15
- package/dist/form/components/fields/number-input.js.map +1 -1
- package/dist/form/components/fields/password-input.js +21 -15
- package/dist/form/components/fields/password-input.js.map +1 -1
- package/dist/form/components/fields/rich-editor.js +2 -2
- package/dist/form/components/fields/rich-editor.js.map +1 -1
- package/dist/form/components/fields/text-input.js +19 -13
- package/dist/form/components/fields/text-input.js.map +1 -1
- package/dist/form/components/form.js +1 -1
- package/dist/form/components/form.js.map +1 -1
- package/dist/form/skeleton.js +1 -1
- package/dist/form/skeleton.js.map +1 -1
- package/dist/i18n/translatable.d.ts +4 -0
- package/dist/i18n/translatable.js +24 -0
- package/dist/i18n/translatable.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -1
- package/dist/lattice.css +99 -6
- package/dist/layout/callouts.js +1 -1
- package/dist/layout/callouts.js.map +1 -1
- package/dist/layout/components.js +3 -1
- package/dist/layout/components.js.map +1 -1
- package/dist/layout/dropdown.js +2 -1
- package/dist/layout/dropdown.js.map +1 -1
- package/dist/layout/menu-item.js +31 -10
- package/dist/layout/menu-item.js.map +1 -1
- package/dist/layout/sidebar.js +1 -1
- package/dist/layout/sidebar.js.map +1 -1
- package/dist/layout/topbar.d.ts +3 -0
- package/dist/layout/topbar.js +15 -0
- package/dist/layout/topbar.js.map +1 -0
- package/dist/page.js +15 -10
- package/dist/page.js.map +1 -1
- package/dist/realtime/build-effects.d.ts +4 -0
- package/dist/realtime/build-effects.js +23 -0
- package/dist/realtime/build-effects.js.map +1 -0
- package/dist/realtime/listeners.d.ts +8 -0
- package/dist/realtime/listeners.js +31 -0
- package/dist/realtime/listeners.js.map +1 -0
- package/dist/realtime/subscriptions.d.ts +4 -0
- package/dist/realtime/subscriptions.js +45 -0
- package/dist/realtime/subscriptions.js.map +1 -0
- package/dist/registry.js +2 -1
- package/dist/registry.js.map +1 -1
- package/dist/remote/components/chat-box.d.ts +3 -0
- package/dist/remote/components/chat-box.js +65 -0
- package/dist/remote/components/chat-box.js.map +1 -0
- package/dist/remote/components/data-list.d.ts +10 -0
- package/dist/remote/components/data-list.js +106 -0
- package/dist/remote/components/data-list.js.map +1 -0
- package/dist/remote/index.d.ts +1 -0
- package/dist/remote/index.js +15 -0
- package/dist/remote/index.js.map +1 -0
- package/dist/table/components/cells/text-cell.js +1 -1
- package/dist/table/components/cells/text-cell.js.map +1 -1
- package/dist/table/components/column-filter-control.d.ts +2 -1
- package/dist/table/components/column-filter-control.js +28 -19
- package/dist/table/components/column-filter-control.js.map +1 -1
- package/dist/table/components/column-header.js +2 -2
- package/dist/table/components/column-header.js.map +1 -1
- package/dist/table/components/filter-bar.d.ts +7 -6
- package/dist/table/components/filter-bar.js +51 -28
- package/dist/table/components/filter-bar.js.map +1 -1
- package/dist/table/components/filter-controls.js +2 -2
- package/dist/table/components/filter-controls.js.map +1 -1
- package/dist/table/components/filter-stack-bar.js +4 -3
- package/dist/table/components/filter-stack-bar.js.map +1 -1
- package/dist/table/components/filter-value-input.js +1 -1
- package/dist/table/components/filter-value-input.js.map +1 -1
- package/dist/table/components/sort-bar.js +1 -1
- package/dist/table/components/sort-bar.js.map +1 -1
- package/dist/table/components/table.js +25 -16
- package/dist/table/components/table.js.map +1 -1
- package/dist/table/use-table.d.ts +1 -0
- package/dist/table/use-table.js +4 -0
- package/dist/table/use-table.js.map +1 -1
- package/dist/toast/toast.js +5 -2
- package/dist/toast/toast.js.map +1 -1
- package/dist/toast/toaster.js +4 -3
- package/dist/toast/toaster.js.map +1 -1
- package/dist/types/generated.d.ts +88 -4
- package/package.json +20 -1
package/dist/lattice.css
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
:root,
|
|
4
4
|
[data-theme="light"] {
|
|
5
|
-
--lt-bg: var(--background, oklch(
|
|
5
|
+
--lt-bg: var(--background, oklch(0.97 0 0));
|
|
6
6
|
--lt-fg: var(--foreground, oklch(0.145 0 0));
|
|
7
7
|
--lt-surface: var(--card, oklch(1 0 0));
|
|
8
8
|
--lt-surface-fg: var(--card-foreground, oklch(0.145 0 0));
|
|
@@ -27,15 +27,72 @@
|
|
|
27
27
|
--lt-success-fg: var(--success-foreground, oklch(0.985 0 0));
|
|
28
28
|
--lt-info: var(--info, oklch(0.62 0.14 240));
|
|
29
29
|
--lt-info-fg: var(--info-foreground, oklch(0.985 0 0));
|
|
30
|
-
|
|
31
|
-
--lt-
|
|
32
|
-
--lt-
|
|
30
|
+
/* Interaction states (hover / active / disabled) */
|
|
31
|
+
--lt-primary-hover: var(--primary-hover, oklch(0.43 0.092 182));
|
|
32
|
+
--lt-primary-active: var(--primary-active, oklch(0.39 0.092 182));
|
|
33
|
+
--lt-danger-hover: var(--destructive-hover, oklch(0.53 0.21 27.3));
|
|
34
|
+
--lt-danger-active: var(--destructive-active, oklch(0.48 0.21 27.3));
|
|
35
|
+
--lt-success-hover: var(--success-hover, oklch(0.57 0.125 160));
|
|
36
|
+
--lt-success-active: var(--success-active, oklch(0.52 0.125 160));
|
|
37
|
+
--lt-info-hover: var(--info-hover, oklch(0.57 0.14 240));
|
|
38
|
+
--lt-info-active: var(--info-active, oklch(0.52 0.14 240));
|
|
39
|
+
--lt-secondary-hover: var(--secondary-hover, oklch(0.93 0 0));
|
|
40
|
+
--lt-secondary-active: var(--secondary-active, oklch(0.9 0 0));
|
|
41
|
+
--lt-disabled: var(--disabled, oklch(0.95 0 0));
|
|
42
|
+
--lt-disabled-fg: var(--disabled-foreground, oklch(0.7 0 0));
|
|
43
|
+
|
|
44
|
+
/* Radius: base = cards, -sm = controls, -xs = chips */
|
|
45
|
+
--lt-radius: var(--radius, 0.5rem);
|
|
46
|
+
--lt-radius-sm: calc(var(--lt-radius) - 0.125rem);
|
|
47
|
+
--lt-radius-xs: calc(var(--lt-radius) - 0.25rem);
|
|
33
48
|
|
|
34
49
|
--lt-icon-xs: 0.75rem;
|
|
35
50
|
--lt-icon-sm: 0.875rem;
|
|
36
51
|
--lt-icon-md: 1rem;
|
|
37
52
|
--lt-icon-lg: 1.25rem;
|
|
38
53
|
--lt-icon-xl: 1.5rem;
|
|
54
|
+
--lt-icon-stroke: 1.5;
|
|
55
|
+
|
|
56
|
+
/* Control heights — density lever */
|
|
57
|
+
--lt-control-h-sm: 2rem;
|
|
58
|
+
--lt-control-h-md: 2.25rem;
|
|
59
|
+
--lt-control-h-lg: 2.5rem;
|
|
60
|
+
|
|
61
|
+
--lt-font-weight-normal: 400;
|
|
62
|
+
--lt-font-weight-medium: 500;
|
|
63
|
+
--lt-font-weight-semibold: 600;
|
|
64
|
+
--lt-font-weight-bold: 700;
|
|
65
|
+
|
|
66
|
+
/* Focus-ring size (colour: --lt-ring) */
|
|
67
|
+
--lt-ring-width: 0.125rem;
|
|
68
|
+
--lt-ring-offset: 0.125rem;
|
|
69
|
+
|
|
70
|
+
/* Elevation */
|
|
71
|
+
--lt-shadow-xs: 0 1px 1px 0 oklch(0 0 0 / 0.04);
|
|
72
|
+
--lt-shadow-sm: 0 1px 2px 0 oklch(0 0 0 / 0.05);
|
|
73
|
+
--lt-shadow-md:
|
|
74
|
+
0 2px 4px -1px oklch(0 0 0 / 0.08), 0 1px 2px -1px oklch(0 0 0 / 0.06);
|
|
75
|
+
--lt-shadow-lg:
|
|
76
|
+
0 8px 16px -4px oklch(0 0 0 / 0.12), 0 2px 4px -2px oklch(0 0 0 / 0.08);
|
|
77
|
+
|
|
78
|
+
/* Z-index scale */
|
|
79
|
+
--lt-z-dropdown: 1000;
|
|
80
|
+
--lt-z-sticky: 1100;
|
|
81
|
+
--lt-z-overlay: 1200;
|
|
82
|
+
--lt-z-modal: 1300;
|
|
83
|
+
--lt-z-popover: 1400;
|
|
84
|
+
--lt-z-toast: 1500;
|
|
85
|
+
|
|
86
|
+
/* Motion */
|
|
87
|
+
--lt-duration-fast: 120ms;
|
|
88
|
+
--lt-duration-base: 160ms;
|
|
89
|
+
--lt-duration-slow: 240ms;
|
|
90
|
+
--lt-ease: cubic-bezier(0.2, 0, 0, 1);
|
|
91
|
+
|
|
92
|
+
/* Layout dimensions */
|
|
93
|
+
--lt-sidebar-w: 16rem;
|
|
94
|
+
--lt-sidebar-w-collapsed: 4rem;
|
|
95
|
+
--lt-container-max: 80rem;
|
|
39
96
|
|
|
40
97
|
color-scheme: light;
|
|
41
98
|
}
|
|
@@ -68,6 +125,20 @@
|
|
|
68
125
|
--lt-info: var(--info, oklch(0.7 0.14 240));
|
|
69
126
|
--lt-info-fg: var(--info-foreground, oklch(0.205 0 0));
|
|
70
127
|
|
|
128
|
+
/* Interaction states (dark) */
|
|
129
|
+
--lt-primary-hover: var(--primary-hover, oklch(0.79 0.105 182));
|
|
130
|
+
--lt-primary-active: var(--primary-active, oklch(0.84 0.105 182));
|
|
131
|
+
--lt-danger-hover: var(--destructive-hover, oklch(0.47 0.13 26));
|
|
132
|
+
--lt-danger-active: var(--destructive-active, oklch(0.52 0.13 26));
|
|
133
|
+
--lt-success-hover: var(--success-hover, oklch(0.75 0.15 162));
|
|
134
|
+
--lt-success-active: var(--success-active, oklch(0.8 0.15 162));
|
|
135
|
+
--lt-info-hover: var(--info-hover, oklch(0.75 0.14 240));
|
|
136
|
+
--lt-info-active: var(--info-active, oklch(0.8 0.14 240));
|
|
137
|
+
--lt-secondary-hover: var(--secondary-hover, oklch(0.32 0 0));
|
|
138
|
+
--lt-secondary-active: var(--secondary-active, oklch(0.36 0 0));
|
|
139
|
+
--lt-disabled: var(--disabled, oklch(0.32 0 0));
|
|
140
|
+
--lt-disabled-fg: var(--disabled-foreground, oklch(0.55 0 0));
|
|
141
|
+
|
|
71
142
|
color-scheme: dark;
|
|
72
143
|
}
|
|
73
144
|
|
|
@@ -97,16 +168,35 @@
|
|
|
97
168
|
--color-lt-success-fg: var(--lt-success-fg);
|
|
98
169
|
--color-lt-info: var(--lt-info);
|
|
99
170
|
--color-lt-info-fg: var(--lt-info-fg);
|
|
171
|
+
--color-lt-primary-hover: var(--lt-primary-hover);
|
|
172
|
+
--color-lt-primary-active: var(--lt-primary-active);
|
|
173
|
+
--color-lt-danger-hover: var(--lt-danger-hover);
|
|
174
|
+
--color-lt-danger-active: var(--lt-danger-active);
|
|
175
|
+
--color-lt-success-hover: var(--lt-success-hover);
|
|
176
|
+
--color-lt-success-active: var(--lt-success-active);
|
|
177
|
+
--color-lt-info-hover: var(--lt-info-hover);
|
|
178
|
+
--color-lt-info-active: var(--lt-info-active);
|
|
179
|
+
--color-lt-secondary-hover: var(--lt-secondary-hover);
|
|
180
|
+
--color-lt-secondary-active: var(--lt-secondary-active);
|
|
181
|
+
--color-lt-disabled: var(--lt-disabled);
|
|
182
|
+
--color-lt-disabled-fg: var(--lt-disabled-fg);
|
|
100
183
|
--radius-lt: var(--lt-radius);
|
|
101
184
|
--radius-lt-sm: var(--lt-radius-sm);
|
|
102
185
|
--radius-lt-xs: var(--lt-radius-xs);
|
|
186
|
+
--shadow-lt-xs: var(--lt-shadow-xs);
|
|
187
|
+
--shadow-lt-sm: var(--lt-shadow-sm);
|
|
188
|
+
--shadow-lt-md: var(--lt-shadow-md);
|
|
189
|
+
--shadow-lt-lg: var(--lt-shadow-lg);
|
|
103
190
|
--spacing-lt-icon-xs: var(--lt-icon-xs);
|
|
104
191
|
--spacing-lt-icon-sm: var(--lt-icon-sm);
|
|
105
192
|
--spacing-lt-icon-md: var(--lt-icon-md);
|
|
106
193
|
--spacing-lt-icon-lg: var(--lt-icon-lg);
|
|
107
194
|
--spacing-lt-icon-xl: var(--lt-icon-xl);
|
|
108
|
-
--
|
|
109
|
-
--
|
|
195
|
+
--spacing-lt-control-sm: var(--lt-control-h-sm);
|
|
196
|
+
--spacing-lt-control-md: var(--lt-control-h-md);
|
|
197
|
+
--spacing-lt-control-lg: var(--lt-control-h-lg);
|
|
198
|
+
--animate-lt-toast-in: lt-toast-in var(--lt-duration-base) ease-out;
|
|
199
|
+
--animate-lt-toast-out: lt-toast-out var(--lt-duration-fast) ease-in;
|
|
110
200
|
}
|
|
111
201
|
|
|
112
202
|
@theme {
|
|
@@ -115,6 +205,9 @@
|
|
|
115
205
|
"Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
|
|
116
206
|
"Segoe UI Symbol", "Noto Color Emoji";
|
|
117
207
|
|
|
208
|
+
/* Base spacing unit */
|
|
209
|
+
--spacing: 0.25rem;
|
|
210
|
+
|
|
118
211
|
--text-xs: 0.625rem;
|
|
119
212
|
--text-xs--line-height: 1.6;
|
|
120
213
|
--text-sm: 0.6875rem;
|
package/dist/layout/callouts.js
CHANGED
|
@@ -50,7 +50,7 @@ var Callouts = () => {
|
|
|
50
50
|
type: "button",
|
|
51
51
|
"aria-label": t("a11y.dismiss", "Dismiss"),
|
|
52
52
|
"data-test": "callout-dismiss",
|
|
53
|
-
className: "shrink-0 rounded-
|
|
53
|
+
className: "shrink-0 rounded-lt-sm p-1 text-lt-muted-fg transition-colors hover:bg-lt-muted hover:text-lt-fg",
|
|
54
54
|
onClick: () => dismiss(callout.id),
|
|
55
55
|
children: /* @__PURE__ */ jsx(Icon, {
|
|
56
56
|
name: "x",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callouts.js","names":[],"sources":["../../resources/js/layout/callouts.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { useEffect, useState } from \"react\";\nimport { RenderNode } from \"@lattice-php/lattice/core/renderer\";\nimport type { Callout } from \"@lattice-php/lattice/types/generated\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { onCallout } from \"@lattice-php/lattice/toast/callout\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { variantStyles } from \"@lattice-php/lattice/toast/variant-styles\";\n\ntype CalloutItem = Callout & { id: number };\n\nlet nextId = 0;\n\nconst Callouts: RendererComponent<\"callouts\"> = () => {\n const { t } = useT(\"lattice\");\n const [callouts, setCallouts] = useState<CalloutItem[]>([]);\n\n useEffect(\n () =>\n onCallout((callout) => {\n setCallouts((current) => [...current, { ...callout, id: nextId++ }]);\n }),\n [],\n );\n\n function dismiss(id: number): void {\n setCallouts((current) => current.filter((callout) => callout.id !== id));\n }\n\n if (callouts.length === 0) {\n return null;\n }\n\n return (\n <div className=\"flex w-full flex-col gap-2\">\n {callouts.map((callout) => (\n <div\n key={callout.id}\n role=\"status\"\n data-test={`callout-${callout.variant}`}\n className={cn(\n \"flex items-start gap-3 rounded-lt border border-l-4 border-lt-border bg-lt-popover p-4 text-lt-popover-fg\",\n variantStyles[callout.variant].accent,\n )}\n >\n {variantStyles[callout.variant].icon}\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n {callout.title ? (\n <p className=\"text-sm font-medium text-lt-fg\">{callout.title}</p>\n ) : null}\n <p className=\"text-sm text-lt-fg\">{callout.message}</p>\n {callout.action ? (\n <div className=\"flex flex-wrap gap-2\">\n <RenderNode node={callout.action} />\n </div>\n ) : null}\n </div>\n {callout.dismissible ? (\n <button\n type=\"button\"\n aria-label={t(\"a11y.dismiss\", \"Dismiss\")}\n data-test=\"callout-dismiss\"\n className=\"shrink-0 rounded-
|
|
1
|
+
{"version":3,"file":"callouts.js","names":[],"sources":["../../resources/js/layout/callouts.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { useEffect, useState } from \"react\";\nimport { RenderNode } from \"@lattice-php/lattice/core/renderer\";\nimport type { Callout } from \"@lattice-php/lattice/types/generated\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { onCallout } from \"@lattice-php/lattice/toast/callout\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { variantStyles } from \"@lattice-php/lattice/toast/variant-styles\";\n\ntype CalloutItem = Callout & { id: number };\n\nlet nextId = 0;\n\nconst Callouts: RendererComponent<\"callouts\"> = () => {\n const { t } = useT(\"lattice\");\n const [callouts, setCallouts] = useState<CalloutItem[]>([]);\n\n useEffect(\n () =>\n onCallout((callout) => {\n setCallouts((current) => [...current, { ...callout, id: nextId++ }]);\n }),\n [],\n );\n\n function dismiss(id: number): void {\n setCallouts((current) => current.filter((callout) => callout.id !== id));\n }\n\n if (callouts.length === 0) {\n return null;\n }\n\n return (\n <div className=\"flex w-full flex-col gap-2\">\n {callouts.map((callout) => (\n <div\n key={callout.id}\n role=\"status\"\n data-test={`callout-${callout.variant}`}\n className={cn(\n \"flex items-start gap-3 rounded-lt border border-l-4 border-lt-border bg-lt-popover p-4 text-lt-popover-fg\",\n variantStyles[callout.variant].accent,\n )}\n >\n {variantStyles[callout.variant].icon}\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n {callout.title ? (\n <p className=\"text-sm font-medium text-lt-fg\">{callout.title}</p>\n ) : null}\n <p className=\"text-sm text-lt-fg\">{callout.message}</p>\n {callout.action ? (\n <div className=\"flex flex-wrap gap-2\">\n <RenderNode node={callout.action} />\n </div>\n ) : null}\n </div>\n {callout.dismissible ? (\n <button\n type=\"button\"\n aria-label={t(\"a11y.dismiss\", \"Dismiss\")}\n data-test=\"callout-dismiss\"\n className=\"shrink-0 rounded-lt-sm p-1 text-lt-muted-fg transition-colors hover:bg-lt-muted hover:text-lt-fg\"\n onClick={() => dismiss(callout.id)}\n >\n <Icon name=\"x\" className=\"size-lt-icon-md\" />\n </button>\n ) : null}\n </div>\n ))}\n </div>\n );\n};\n\nexport default Callouts;\n"],"mappings":";;;;;;;;;AAYA,IAAI,SAAS;AAEb,IAAM,iBAAgD;CACpD,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,CAAC,UAAU,eAAe,SAAwB,CAAC,CAAC;CAE1D,gBAEI,WAAW,YAAY;EACrB,aAAa,YAAY,CAAC,GAAG,SAAS;GAAE,GAAG;GAAS,IAAI;EAAS,CAAC,CAAC;CACrE,CAAC,GACH,CAAC,CACH;CAEA,SAAS,QAAQ,IAAkB;EACjC,aAAa,YAAY,QAAQ,QAAQ,YAAY,QAAQ,OAAO,EAAE,CAAC;CACzE;CAEA,IAAI,SAAS,WAAW,GACtB,OAAO;CAGT,OACE,oBAAC,OAAD;EAAK,WAAU;YACZ,SAAS,KAAK,YACb,qBAAC,OAAD;GAEE,MAAK;GACL,aAAW,WAAW,QAAQ;GAC9B,WAAW,GACT,6GACA,cAAc,QAAQ,SAAS,MACjC;aAPF;IASG,cAAc,QAAQ,SAAS;IAChC,qBAAC,OAAD;KAAK,WAAU;eAAf;MACG,QAAQ,QACP,oBAAC,KAAD;OAAG,WAAU;iBAAkC,QAAQ;MAAS,CAAA,IAC9D;MACJ,oBAAC,KAAD;OAAG,WAAU;iBAAsB,QAAQ;MAAW,CAAA;MACrD,QAAQ,SACP,oBAAC,OAAD;OAAK,WAAU;iBACb,oBAAC,YAAD,EAAY,MAAM,QAAQ,OAAS,CAAA;MAChC,CAAA,IACH;KACD;;IACJ,QAAQ,cACP,oBAAC,UAAD;KACE,MAAK;KACL,cAAY,EAAE,gBAAgB,SAAS;KACvC,aAAU;KACV,WAAU;KACV,eAAe,QAAQ,QAAQ,EAAE;eAEjC,oBAAC,MAAD;MAAM,MAAK;MAAI,WAAU;KAAmB,CAAA;IACtC,CAAA,IACN;GACD;KA/BE,QAAQ,EA+BV,CACN;CACE,CAAA;AAET"}
|
|
@@ -6,6 +6,7 @@ import MenuComponent from "./menu.js";
|
|
|
6
6
|
import MenuItemComponent from "./menu-item.js";
|
|
7
7
|
import OutletComponent from "./outlet.js";
|
|
8
8
|
import SidebarComponent from "./sidebar.js";
|
|
9
|
+
import TopbarComponent from "./topbar.js";
|
|
9
10
|
//#region resources/js/layout/components.ts
|
|
10
11
|
var layoutComponents = createPlugin({
|
|
11
12
|
components: {
|
|
@@ -15,7 +16,8 @@ var layoutComponents = createPlugin({
|
|
|
15
16
|
menu: eagerComponent(MenuComponent),
|
|
16
17
|
"menu-item": eagerComponent(MenuItemComponent),
|
|
17
18
|
outlet: eagerComponent(OutletComponent),
|
|
18
|
-
sidebar: eagerComponent(SidebarComponent)
|
|
19
|
+
sidebar: eagerComponent(SidebarComponent),
|
|
20
|
+
topbar: eagerComponent(TopbarComponent)
|
|
19
21
|
},
|
|
20
22
|
name: "lattice/layout"
|
|
21
23
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.js","names":[],"sources":["../../resources/js/layout/components.ts"],"sourcesContent":["import { createPlugin, eagerComponent } from \"@lattice-php/lattice/core/registry\";\nimport BreadcrumbsComponent from \"./breadcrumbs\";\nimport CalloutsComponent from \"./callouts\";\nimport DropdownComponent from \"./dropdown\";\nimport MenuComponent from \"./menu\";\nimport MenuItemComponent from \"./menu-item\";\nimport OutletComponent from \"./outlet\";\nimport SidebarComponent from \"./sidebar\";\n\nexport const layoutComponents = createPlugin({\n components: {\n breadcrumbs: eagerComponent(BreadcrumbsComponent),\n callouts: eagerComponent(CalloutsComponent),\n dropdown: eagerComponent(DropdownComponent),\n menu: eagerComponent(MenuComponent),\n \"menu-item\": eagerComponent(MenuItemComponent),\n outlet: eagerComponent(OutletComponent),\n sidebar: eagerComponent(SidebarComponent),\n },\n name: \"lattice/layout\",\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"components.js","names":[],"sources":["../../resources/js/layout/components.ts"],"sourcesContent":["import { createPlugin, eagerComponent } from \"@lattice-php/lattice/core/registry\";\nimport BreadcrumbsComponent from \"./breadcrumbs\";\nimport CalloutsComponent from \"./callouts\";\nimport DropdownComponent from \"./dropdown\";\nimport MenuComponent from \"./menu\";\nimport MenuItemComponent from \"./menu-item\";\nimport OutletComponent from \"./outlet\";\nimport SidebarComponent from \"./sidebar\";\nimport TopbarComponent from \"./topbar\";\n\nexport const layoutComponents = createPlugin({\n components: {\n breadcrumbs: eagerComponent(BreadcrumbsComponent),\n callouts: eagerComponent(CalloutsComponent),\n dropdown: eagerComponent(DropdownComponent),\n menu: eagerComponent(MenuComponent),\n \"menu-item\": eagerComponent(MenuItemComponent),\n outlet: eagerComponent(OutletComponent),\n sidebar: eagerComponent(SidebarComponent),\n topbar: eagerComponent(TopbarComponent),\n },\n name: \"lattice/layout\",\n});\n"],"mappings":";;;;;;;;;;AAUA,IAAa,mBAAmB,aAAa;CAC3C,YAAY;EACV,aAAa,eAAe,oBAAoB;EAChD,UAAU,eAAe,QAAiB;EAC1C,UAAU,eAAe,iBAAiB;EAC1C,MAAM,eAAe,aAAa;EAClC,aAAa,eAAe,iBAAiB;EAC7C,QAAQ,eAAe,eAAe;EACtC,SAAS,eAAe,gBAAgB;EACxC,QAAQ,eAAe,eAAe;CACxC;CACA,MAAM;AACR,CAAC"}
|
package/dist/layout/dropdown.js
CHANGED
|
@@ -7,8 +7,9 @@ var DropdownComponent = ({ children, node }) => {
|
|
|
7
7
|
return /* @__PURE__ */ jsx(Popover, {
|
|
8
8
|
placement: node.props.placement,
|
|
9
9
|
testId,
|
|
10
|
+
triggerClassName: "w-auto",
|
|
10
11
|
trigger: /* @__PURE__ */ jsx("span", {
|
|
11
|
-
className: "flex min-w-0 items-center rounded-
|
|
12
|
+
className: "flex min-w-0 items-center rounded-lt-sm px-2 py-1.5 text-sm hover:bg-lt-muted",
|
|
12
13
|
children: node.props.trigger.map((triggerNode, index) => /* @__PURE__ */ jsx(RenderNode, { node: triggerNode }, triggerNode.key ?? `${triggerNode.type}-${index}`))
|
|
13
14
|
}),
|
|
14
15
|
children: /* @__PURE__ */ jsx("ul", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropdown.js","names":[],"sources":["../../resources/js/layout/dropdown.tsx"],"sourcesContent":["import type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { RenderNode } from \"@lattice-php/lattice/core/renderer\";\nimport { Popover } from \"./popover\";\n\nconst DropdownComponent: RendererComponent<\"dropdown\"> = ({ children, node }) => {\n const testId = node.key ?? \"dropdown\";\n\n return (\n <Popover\n placement={node.props.placement}\n testId={testId}\n trigger={\n <span className=\"flex min-w-0 items-center rounded-
|
|
1
|
+
{"version":3,"file":"dropdown.js","names":[],"sources":["../../resources/js/layout/dropdown.tsx"],"sourcesContent":["import type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { RenderNode } from \"@lattice-php/lattice/core/renderer\";\nimport { Popover } from \"./popover\";\n\nconst DropdownComponent: RendererComponent<\"dropdown\"> = ({ children, node }) => {\n const testId = node.key ?? \"dropdown\";\n\n return (\n <Popover\n placement={node.props.placement}\n testId={testId}\n triggerClassName=\"w-auto\"\n trigger={\n <span className=\"flex min-w-0 items-center rounded-lt-sm px-2 py-1.5 text-sm hover:bg-lt-muted\">\n {node.props.trigger.map((triggerNode, index) => (\n <RenderNode\n key={triggerNode.key ?? `${triggerNode.type}-${index}`}\n node={triggerNode}\n />\n ))}\n </span>\n }\n >\n <ul className=\"flex flex-col gap-1\">{children}</ul>\n </Popover>\n );\n};\n\nexport default DropdownComponent;\n"],"mappings":";;;;AAIA,IAAM,qBAAoD,EAAE,UAAU,WAAW;CAC/E,MAAM,SAAS,KAAK,OAAO;CAE3B,OACE,oBAAC,SAAD;EACE,WAAW,KAAK,MAAM;EACd;EACR,kBAAiB;EACjB,SACE,oBAAC,QAAD;GAAM,WAAU;aACb,KAAK,MAAM,QAAQ,KAAK,aAAa,UACpC,oBAAC,YAAD,EAEE,MAAM,YACP,GAFM,YAAY,OAAO,GAAG,YAAY,KAAK,GAAG,OAEhD,CACF;EACG,CAAA;YAGR,oBAAC,MAAD;GAAI,WAAU;GAAuB;EAAa,CAAA;CAC3C,CAAA;AAEb"}
|
package/dist/layout/menu-item.js
CHANGED
|
@@ -8,7 +8,17 @@ import { useState } from "react";
|
|
|
8
8
|
import { Link, usePage } from "@inertiajs/react";
|
|
9
9
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
10
10
|
//#region resources/js/layout/menu-item.tsx
|
|
11
|
-
var rowClass = "flex items-center gap-2 rounded-
|
|
11
|
+
var rowClass = "flex items-center gap-2 rounded-lt-sm px-3 py-2 text-base font-medium text-lt-fg transition-colors hover:bg-lt-muted";
|
|
12
|
+
function MenuAffix({ affix, className }) {
|
|
13
|
+
if (affix.icon) return /* @__PURE__ */ jsx(IconRenderer, {
|
|
14
|
+
className: cn("size-lt-icon-md shrink-0", className),
|
|
15
|
+
icon: affix.icon
|
|
16
|
+
});
|
|
17
|
+
return /* @__PURE__ */ jsx("span", {
|
|
18
|
+
className: cn("shrink-0 text-sm text-lt-muted-fg", className),
|
|
19
|
+
children: affix.text
|
|
20
|
+
});
|
|
21
|
+
}
|
|
12
22
|
function schemaContainsPath(schema, path) {
|
|
13
23
|
return (schema ?? []).some((child) => child.props?.href === path || schemaContainsPath(child.schema, path));
|
|
14
24
|
}
|
|
@@ -16,24 +26,35 @@ var MenuItemComponent = ({ children, node }) => {
|
|
|
16
26
|
const collapsed = useCollapsed();
|
|
17
27
|
const icon = node.props.icon;
|
|
18
28
|
const label = node.props.label;
|
|
29
|
+
const prefix = node.props.prefix;
|
|
30
|
+
const suffix = node.props.suffix;
|
|
31
|
+
const iconOnly = Boolean(icon);
|
|
32
|
+
const flyoutIcon = icon ?? prefix?.icon ?? null;
|
|
19
33
|
const href = node.props.href ?? "";
|
|
20
34
|
const currentPath = usePage().url.split("?")[0];
|
|
21
35
|
const testId = prefixedNodeTestId("menu", node);
|
|
22
|
-
const content =
|
|
36
|
+
const content = icon ? /* @__PURE__ */ jsx(IconRenderer, {
|
|
23
37
|
className: "size-lt-icon-md shrink-0",
|
|
24
38
|
icon
|
|
25
|
-
}) :
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
39
|
+
}) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
40
|
+
prefix ? /* @__PURE__ */ jsx(MenuAffix, { affix: prefix }) : null,
|
|
41
|
+
collapsed ? /* @__PURE__ */ jsx("span", {
|
|
42
|
+
className: "pointer-events-none absolute top-1/2 left-full z-50 ml-2 hidden -translate-y-1/2 rounded-lt-sm border border-lt-border bg-lt-popover px-2 py-1 text-sm whitespace-nowrap text-lt-popover-fg shadow-lt-md group-hover:block",
|
|
43
|
+
role: "tooltip",
|
|
44
|
+
children: label
|
|
45
|
+
}) : /* @__PURE__ */ jsx("span", { children: label }),
|
|
46
|
+
suffix ? /* @__PURE__ */ jsx(MenuAffix, {
|
|
47
|
+
affix: suffix,
|
|
48
|
+
className: "ml-auto"
|
|
49
|
+
}) : null
|
|
50
|
+
] });
|
|
30
51
|
if (href === "") {
|
|
31
52
|
if (!children) return collapsed ? null : /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("span", {
|
|
32
53
|
className: "flex items-center gap-2 px-3 py-2 text-xs font-semibold tracking-wide text-lt-muted-fg uppercase",
|
|
33
54
|
children: content
|
|
34
55
|
}) });
|
|
35
56
|
if (collapsed) return /* @__PURE__ */ jsx(FlyoutGroup, {
|
|
36
|
-
icon,
|
|
57
|
+
icon: flyoutIcon,
|
|
37
58
|
label,
|
|
38
59
|
testId,
|
|
39
60
|
children
|
|
@@ -49,9 +70,9 @@ var MenuItemComponent = ({ children, node }) => {
|
|
|
49
70
|
const method = node.props.method ?? "get";
|
|
50
71
|
return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, {
|
|
51
72
|
"aria-current": active ? "page" : void 0,
|
|
52
|
-
"aria-label": collapsed ? label : void 0,
|
|
73
|
+
"aria-label": collapsed || iconOnly ? label : void 0,
|
|
53
74
|
as: method === "get" ? void 0 : "button",
|
|
54
|
-
className: cn(rowClass, "w-full", collapsed && "group relative justify-center", active && "bg-lt-muted font-medium"),
|
|
75
|
+
className: cn(rowClass, "w-full", collapsed && "group relative justify-center", iconOnly && "justify-center", active && "bg-lt-muted font-medium"),
|
|
55
76
|
"data-test": testId,
|
|
56
77
|
href,
|
|
57
78
|
method,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-item.js","names":[],"sources":["../../resources/js/layout/menu-item.tsx"],"sourcesContent":["import { Link, usePage } from \"@inertiajs/react\";\nimport { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { prefixedNodeTestId } from \"@lattice-php/lattice/core/test-id\";\nimport type { RendererComponent, Schema } from \"@lattice-php/lattice/core/types\";\nimport { Icon, IconRenderer } from \"@lattice-php/lattice/icons\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { useSidebarCollapsed } from \"./context\";\nimport { Popover } from \"./popover\";\n\nconst rowClass =\n \"flex items-center gap-2 rounded-
|
|
1
|
+
{"version":3,"file":"menu-item.js","names":[],"sources":["../../resources/js/layout/menu-item.tsx"],"sourcesContent":["import { Link, usePage } from \"@inertiajs/react\";\nimport { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { prefixedNodeTestId } from \"@lattice-php/lattice/core/test-id\";\nimport type { RendererComponent, Schema } from \"@lattice-php/lattice/core/types\";\nimport { Icon, IconRenderer } from \"@lattice-php/lattice/icons\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport type { Affix } from \"@lattice-php/lattice/types/generated\";\nimport { useSidebarCollapsed } from \"./context\";\nimport { Popover } from \"./popover\";\n\nconst rowClass =\n \"flex items-center gap-2 rounded-lt-sm px-3 py-2 text-base font-medium text-lt-fg transition-colors hover:bg-lt-muted\";\n\nfunction MenuAffix({ affix, className }: { affix: Affix; className?: string }) {\n if (affix.icon) {\n return <IconRenderer className={cn(\"size-lt-icon-md shrink-0\", className)} icon={affix.icon} />;\n }\n\n return <span className={cn(\"shrink-0 text-sm text-lt-muted-fg\", className)}>{affix.text}</span>;\n}\n\nfunction schemaContainsPath(schema: Schema | undefined, path: string): boolean {\n return (schema ?? []).some(\n (child) => child.props?.href === path || schemaContainsPath(child.schema, path),\n );\n}\n\nconst MenuItemComponent: RendererComponent<\"menu-item\"> = ({ children, node }) => {\n const collapsed = useSidebarCollapsed();\n const icon = node.props.icon;\n const label = node.props.label;\n const prefix = node.props.prefix;\n const suffix = node.props.suffix;\n const iconOnly = Boolean(icon);\n const flyoutIcon = icon ?? prefix?.icon ?? null;\n const href = node.props.href ?? \"\";\n const currentPath = usePage().url.split(\"?\")[0];\n const testId = prefixedNodeTestId(\"menu\", node);\n\n const content = icon ? (\n <IconRenderer className=\"size-lt-icon-md shrink-0\" icon={icon} />\n ) : (\n <>\n {prefix ? <MenuAffix affix={prefix} /> : null}\n {collapsed ? (\n <span\n className=\"pointer-events-none absolute top-1/2 left-full z-50 ml-2 hidden -translate-y-1/2 rounded-lt-sm border border-lt-border bg-lt-popover px-2 py-1 text-sm whitespace-nowrap text-lt-popover-fg shadow-lt-md group-hover:block\"\n role=\"tooltip\"\n >\n {label}\n </span>\n ) : (\n <span>{label}</span>\n )}\n {suffix ? <MenuAffix affix={suffix} className=\"ml-auto\" /> : null}\n </>\n );\n\n if (href === \"\") {\n if (!children) {\n return collapsed ? null : (\n <li>\n <span className=\"flex items-center gap-2 px-3 py-2 text-xs font-semibold tracking-wide text-lt-muted-fg uppercase\">\n {content}\n </span>\n </li>\n );\n }\n\n if (collapsed) {\n return (\n <FlyoutGroup icon={flyoutIcon} label={label} testId={testId}>\n {children}\n </FlyoutGroup>\n );\n }\n\n return (\n <CollapsibleItem\n content={content}\n defaultOpen={schemaContainsPath(node.schema, currentPath)}\n testId={testId}\n >\n {children}\n </CollapsibleItem>\n );\n }\n\n const active = currentPath === href;\n const method = node.props.method ?? \"get\";\n\n return (\n <li>\n <Link\n aria-current={active ? \"page\" : undefined}\n aria-label={collapsed || iconOnly ? label : undefined}\n as={method === \"get\" ? undefined : \"button\"}\n className={cn(\n rowClass,\n \"w-full\",\n collapsed && \"group relative justify-center\",\n iconOnly && \"justify-center\",\n active && \"bg-lt-muted font-medium\",\n )}\n data-test={testId}\n href={href}\n method={method}\n >\n {content}\n </Link>\n </li>\n );\n};\n\nfunction CollapsibleItem({\n children,\n content,\n defaultOpen,\n testId,\n}: {\n children: ReactNode;\n content: ReactNode;\n defaultOpen: boolean;\n testId?: string;\n}) {\n const [open, setOpen] = useState(defaultOpen);\n\n return (\n <li>\n <button\n aria-expanded={open}\n className={cn(rowClass, \"w-full\")}\n data-test={testId}\n onClick={() => setOpen((value) => !value)}\n type=\"button\"\n >\n {content}\n <Icon\n name=\"chevron-right\"\n className={cn(\n \"ml-auto size-lt-icon-md shrink-0 transition-transform\",\n open && \"rotate-90\",\n )}\n />\n </button>\n {open ? <ul className=\"mt-1 flex flex-col gap-1 pl-3\">{children}</ul> : null}\n </li>\n );\n}\n\nfunction FlyoutGroup({\n children,\n icon,\n label,\n testId,\n}: {\n children: ReactNode;\n icon?: string | null;\n label: string;\n testId?: string;\n}) {\n return (\n <li>\n <Popover\n className=\"min-w-48\"\n placement=\"right\"\n testId={testId}\n trigger={\n icon ? (\n <IconRenderer className=\"size-lt-icon-md shrink-0\" icon={icon} />\n ) : (\n <span>{label}</span>\n )\n }\n triggerClassName={cn(rowClass, \"justify-center\")}\n triggerLabel={label}\n >\n <ul className=\"flex flex-col gap-1\">\n <li className=\"px-3 py-1.5 text-xs font-semibold tracking-wide text-lt-muted-fg uppercase\">\n {label}\n </li>\n {children}\n </ul>\n </Popover>\n </li>\n );\n}\n\nexport default MenuItemComponent;\n"],"mappings":";;;;;;;;;;AAWA,IAAM,WACJ;AAEF,SAAS,UAAU,EAAE,OAAO,aAAmD;CAC7E,IAAI,MAAM,MACR,OAAO,oBAAC,cAAD;EAAc,WAAW,GAAG,4BAA4B,SAAS;EAAG,MAAM,MAAM;CAAO,CAAA;CAGhG,OAAO,oBAAC,QAAD;EAAM,WAAW,GAAG,qCAAqC,SAAS;YAAI,MAAM;CAAW,CAAA;AAChG;AAEA,SAAS,mBAAmB,QAA4B,MAAuB;CAC7E,QAAQ,UAAU,CAAC,GAAG,MACnB,UAAU,MAAM,OAAO,SAAS,QAAQ,mBAAmB,MAAM,QAAQ,IAAI,CAChF;AACF;AAEA,IAAM,qBAAqD,EAAE,UAAU,WAAW;CAChF,MAAM,YAAY,aAAoB;CACtC,MAAM,OAAO,KAAK,MAAM;CACxB,MAAM,QAAQ,KAAK,MAAM;CACzB,MAAM,SAAS,KAAK,MAAM;CAC1B,MAAM,SAAS,KAAK,MAAM;CAC1B,MAAM,WAAW,QAAQ,IAAI;CAC7B,MAAM,aAAa,QAAQ,QAAQ,QAAQ;CAC3C,MAAM,OAAO,KAAK,MAAM,QAAQ;CAChC,MAAM,cAAc,QAAQ,EAAE,IAAI,MAAM,GAAG,EAAE;CAC7C,MAAM,SAAS,mBAAmB,QAAQ,IAAI;CAE9C,MAAM,UAAU,OACd,oBAAC,cAAD;EAAc,WAAU;EAAiC;CAAO,CAAA,IAEhE,qBAAA,YAAA,EAAA,UAAA;EACG,SAAS,oBAAC,WAAD,EAAW,OAAO,OAAS,CAAA,IAAI;EACxC,YACC,oBAAC,QAAD;GACE,WAAU;GACV,MAAK;aAEJ;EACG,CAAA,IAEN,oBAAC,QAAD,EAAA,UAAO,MAAY,CAAA;EAEpB,SAAS,oBAAC,WAAD;GAAW,OAAO;GAAQ,WAAU;EAAW,CAAA,IAAI;CAC7D,EAAA,CAAA;CAGJ,IAAI,SAAS,IAAI;EACf,IAAI,CAAC,UACH,OAAO,YAAY,OACjB,oBAAC,MAAD,EAAA,UACE,oBAAC,QAAD;GAAM,WAAU;aACb;EACG,CAAA,EACJ,CAAA;EAIR,IAAI,WACF,OACE,oBAAC,aAAD;GAAa,MAAM;GAAmB;GAAe;GAClD;EACU,CAAA;EAIjB,OACE,oBAAC,iBAAD;GACW;GACT,aAAa,mBAAmB,KAAK,QAAQ,WAAW;GAChD;GAEP;EACc,CAAA;CAErB;CAEA,MAAM,SAAS,gBAAgB;CAC/B,MAAM,SAAS,KAAK,MAAM,UAAU;CAEpC,OACE,oBAAC,MAAD,EAAA,UACE,oBAAC,MAAD;EACE,gBAAc,SAAS,SAAS,KAAA;EAChC,cAAY,aAAa,WAAW,QAAQ,KAAA;EAC5C,IAAI,WAAW,QAAQ,KAAA,IAAY;EACnC,WAAW,GACT,UACA,UACA,aAAa,iCACb,YAAY,kBACZ,UAAU,yBACZ;EACA,aAAW;EACL;EACE;YAEP;CACG,CAAA,EACJ,CAAA;AAER;AAEA,SAAS,gBAAgB,EACvB,UACA,SACA,aACA,UAMC;CACD,MAAM,CAAC,MAAM,WAAW,SAAS,WAAW;CAE5C,OACE,qBAAC,MAAD,EAAA,UAAA,CACE,qBAAC,UAAD;EACE,iBAAe;EACf,WAAW,GAAG,UAAU,QAAQ;EAChC,aAAW;EACX,eAAe,SAAS,UAAU,CAAC,KAAK;EACxC,MAAK;YALP,CAOG,SACD,oBAAC,MAAD;GACE,MAAK;GACL,WAAW,GACT,yDACA,QAAQ,WACV;EACD,CAAA,CACK;KACP,OAAO,oBAAC,MAAD;EAAI,WAAU;EAAiC;CAAa,CAAA,IAAI,IACtE,EAAA,CAAA;AAER;AAEA,SAAS,YAAY,EACnB,UACA,MACA,OACA,UAMC;CACD,OACE,oBAAC,MAAD,EAAA,UACE,oBAAC,SAAD;EACE,WAAU;EACV,WAAU;EACF;EACR,SACE,OACE,oBAAC,cAAD;GAAc,WAAU;GAAiC;EAAO,CAAA,IAEhE,oBAAC,QAAD,EAAA,UAAO,MAAY,CAAA;EAGvB,kBAAkB,GAAG,UAAU,gBAAgB;EAC/C,cAAc;YAEd,qBAAC,MAAD;GAAI,WAAU;aAAd,CACE,oBAAC,MAAD;IAAI,WAAU;cACX;GACC,CAAA,GACH,QACC;;CACG,CAAA,EACP,CAAA;AAER"}
|
package/dist/layout/sidebar.js
CHANGED
|
@@ -30,7 +30,7 @@ var SidebarComponent = ({ children, node }) => {
|
|
|
30
30
|
"aria-expanded": !isCollapsed,
|
|
31
31
|
"aria-label": isCollapsed ? "Expand sidebar" : "Collapse sidebar",
|
|
32
32
|
"data-test": "sidebar-toggle",
|
|
33
|
-
className: cn("inline-flex items-center rounded-
|
|
33
|
+
className: cn("inline-flex items-center rounded-lt-sm p-2 text-lt-fg transition-colors hover:bg-lt-muted", isCollapsed ? "self-center" : "self-end"),
|
|
34
34
|
onClick: toggle,
|
|
35
35
|
type: "button",
|
|
36
36
|
children: /* @__PURE__ */ jsx(Icon, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar.js","names":[],"sources":["../../resources/js/layout/sidebar.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { useState } from \"react\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { CollapsedContext } from \"../core/collapsed-context\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\n\nfunction readStored(key: string, remember: boolean): boolean {\n if (!remember || typeof window === \"undefined\") {\n return false;\n }\n\n return window.localStorage.getItem(key) === \"true\";\n}\n\nconst SidebarComponent: RendererComponent<\"sidebar\"> = ({ children, node }) => {\n const collapsible = node.props.collapsible;\n const rememberState = node.props.rememberState;\n const storageKey = `lattice:sidebar:${node.id ?? \"default\"}`;\n\n const [collapsed, setCollapsed] = useState(() =>\n readStored(storageKey, collapsible && rememberState),\n );\n\n function toggle(): void {\n setCollapsed((value) => {\n const next = !value;\n\n if (rememberState && typeof window !== \"undefined\") {\n window.localStorage.setItem(storageKey, String(next));\n }\n\n return next;\n });\n }\n\n const isCollapsed = collapsible && collapsed;\n\n return (\n <CollapsedContext.Provider value={isCollapsed}>\n <aside\n className={cn(\n \"sticky top-0 flex h-svh shrink-0 flex-col gap-4 border-r border-lt-border p-4 transition-[width]\",\n isCollapsed ? \"w-16 overflow-visible\" : \"w-64 overflow-x-hidden overflow-y-auto\",\n )}\n data-lattice-component={node.id}\n >\n {collapsible ? (\n <button\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n data-test=\"sidebar-toggle\"\n className={cn(\n \"inline-flex items-center rounded-
|
|
1
|
+
{"version":3,"file":"sidebar.js","names":[],"sources":["../../resources/js/layout/sidebar.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { useState } from \"react\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { CollapsedContext } from \"../core/collapsed-context\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\n\nfunction readStored(key: string, remember: boolean): boolean {\n if (!remember || typeof window === \"undefined\") {\n return false;\n }\n\n return window.localStorage.getItem(key) === \"true\";\n}\n\nconst SidebarComponent: RendererComponent<\"sidebar\"> = ({ children, node }) => {\n const collapsible = node.props.collapsible;\n const rememberState = node.props.rememberState;\n const storageKey = `lattice:sidebar:${node.id ?? \"default\"}`;\n\n const [collapsed, setCollapsed] = useState(() =>\n readStored(storageKey, collapsible && rememberState),\n );\n\n function toggle(): void {\n setCollapsed((value) => {\n const next = !value;\n\n if (rememberState && typeof window !== \"undefined\") {\n window.localStorage.setItem(storageKey, String(next));\n }\n\n return next;\n });\n }\n\n const isCollapsed = collapsible && collapsed;\n\n return (\n <CollapsedContext.Provider value={isCollapsed}>\n <aside\n className={cn(\n \"sticky top-0 flex h-svh shrink-0 flex-col gap-4 border-r border-lt-border p-4 transition-[width]\",\n isCollapsed ? \"w-16 overflow-visible\" : \"w-64 overflow-x-hidden overflow-y-auto\",\n )}\n data-lattice-component={node.id}\n >\n {collapsible ? (\n <button\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n data-test=\"sidebar-toggle\"\n className={cn(\n \"inline-flex items-center rounded-lt-sm p-2 text-lt-fg transition-colors hover:bg-lt-muted\",\n isCollapsed ? \"self-center\" : \"self-end\",\n )}\n onClick={toggle}\n type=\"button\"\n >\n <Icon name=\"panel-left\" aria-hidden=\"true\" className=\"size-lt-icon-md shrink-0\" />\n </button>\n ) : null}\n {children}\n </aside>\n </CollapsedContext.Provider>\n );\n};\n\nexport default SidebarComponent;\n"],"mappings":";;;;;;AAMA,SAAS,WAAW,KAAa,UAA4B;CAC3D,IAAI,CAAC,YAAY,OAAO,WAAW,aACjC,OAAO;CAGT,OAAO,OAAO,aAAa,QAAQ,GAAG,MAAM;AAC9C;AAEA,IAAM,oBAAkD,EAAE,UAAU,WAAW;CAC7E,MAAM,cAAc,KAAK,MAAM;CAC/B,MAAM,gBAAgB,KAAK,MAAM;CACjC,MAAM,aAAa,mBAAmB,KAAK,MAAM;CAEjD,MAAM,CAAC,WAAW,gBAAgB,eAChC,WAAW,YAAY,eAAe,aAAa,CACrD;CAEA,SAAS,SAAe;EACtB,cAAc,UAAU;GACtB,MAAM,OAAO,CAAC;GAEd,IAAI,iBAAiB,OAAO,WAAW,aACrC,OAAO,aAAa,QAAQ,YAAY,OAAO,IAAI,CAAC;GAGtD,OAAO;EACT,CAAC;CACH;CAEA,MAAM,cAAc,eAAe;CAEnC,OACE,oBAAC,iBAAiB,UAAlB;EAA2B,OAAO;YAChC,qBAAC,SAAD;GACE,WAAW,GACT,oGACA,cAAc,0BAA0B,wCAC1C;GACA,0BAAwB,KAAK;aAL/B,CAOG,cACC,oBAAC,UAAD;IACE,iBAAe,CAAC;IAChB,cAAY,cAAc,mBAAmB;IAC7C,aAAU;IACV,WAAW,GACT,6FACA,cAAc,gBAAgB,UAChC;IACA,SAAS;IACT,MAAK;cAEL,oBAAC,MAAD;KAAM,MAAK;KAAa,eAAY;KAAO,WAAU;IAA4B,CAAA;GAC3E,CAAA,IACN,MACH,QACI;;CACkB,CAAA;AAE/B"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { cn } from "../lib/utils.js";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
//#region resources/js/layout/topbar.tsx
|
|
4
|
+
var TopbarComponent = ({ children, node }) => {
|
|
5
|
+
const sticky = node.props.sticky;
|
|
6
|
+
return /* @__PURE__ */ jsx("header", {
|
|
7
|
+
"data-lattice-component": node.id,
|
|
8
|
+
className: cn("flex h-14 w-full items-center gap-2 border-b border-lt-border bg-lt-bg px-4 text-lt-fg", sticky && "sticky top-0 z-30"),
|
|
9
|
+
children
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { TopbarComponent as default };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=topbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topbar.js","names":[],"sources":["../../resources/js/layout/topbar.tsx"],"sourcesContent":["import type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\n\nconst TopbarComponent: RendererComponent<\"topbar\"> = ({ children, node }) => {\n const sticky = node.props.sticky;\n\n return (\n <header\n data-lattice-component={node.id}\n className={cn(\n \"flex h-14 w-full items-center gap-2 border-b border-lt-border bg-lt-bg px-4 text-lt-fg\",\n sticky && \"sticky top-0 z-30\",\n )}\n >\n {children}\n </header>\n );\n};\n\nexport default TopbarComponent;\n"],"mappings":";;;AAGA,IAAM,mBAAgD,EAAE,UAAU,WAAW;CAC3E,MAAM,SAAS,KAAK,MAAM;CAE1B,OACE,oBAAC,UAAD;EACE,0BAAwB,KAAK;EAC7B,WAAW,GACT,0FACA,UAAU,mBACZ;EAEC;CACK,CAAA;AAEZ"}
|
package/dist/page.js
CHANGED
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
import { cn } from "./lib/utils.js";
|
|
2
2
|
import { Renderer } from "./core/renderer.js";
|
|
3
|
+
import { RealtimeListeners } from "./realtime/listeners.js";
|
|
3
4
|
import { Head } from "@inertiajs/react";
|
|
4
5
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
6
|
//#region resources/js/page.tsx
|
|
6
7
|
function Page({ lattice }) {
|
|
7
8
|
const content = /* @__PURE__ */ jsx(Renderer, { nodes: lattice.schema });
|
|
8
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
className: "
|
|
9
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
10
|
+
/* @__PURE__ */ jsx(Head, { title: lattice.title ?? void 0 }),
|
|
11
|
+
/* @__PURE__ */ jsx(RealtimeListeners, { listeners: lattice.listeners }),
|
|
12
|
+
lattice.container === "centered" ? /* @__PURE__ */ jsx("main", {
|
|
13
|
+
className: "min-h-svh bg-lt-bg text-lt-fg",
|
|
14
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
15
|
+
"data-test": "lattice-centered-container",
|
|
16
|
+
className: "mx-auto flex min-h-svh w-full max-w-6xl flex-col justify-center px-6 py-12 sm:px-8 lg:px-10",
|
|
17
|
+
children: content
|
|
18
|
+
})
|
|
19
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
20
|
+
"data-test": "lattice-default-container",
|
|
21
|
+
className: cn("w-full", { "px-4 py-6": lattice.layout !== null }),
|
|
13
22
|
children: content
|
|
14
23
|
})
|
|
15
|
-
})
|
|
16
|
-
"data-test": "lattice-default-container",
|
|
17
|
-
className: cn("w-full", { "px-4 py-6": lattice.layout !== null }),
|
|
18
|
-
children: content
|
|
19
|
-
})] });
|
|
24
|
+
] });
|
|
20
25
|
}
|
|
21
26
|
//#endregion
|
|
22
27
|
export { Page as default };
|
package/dist/page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","names":[],"sources":["../resources/js/page.tsx"],"sourcesContent":["import { Head } from \"@inertiajs/react\";\nimport { Renderer } from \"@lattice-php/lattice/core/renderer\";\nimport type { PagePayload } from \"@lattice-php/lattice\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\n\ntype Props = {\n lattice: PagePayload;\n};\n\nexport default function Page({ lattice }: Props) {\n const content = <Renderer nodes={lattice.schema} />;\n\n return (\n <>\n <Head title={lattice.title ?? undefined} />\n\n {lattice.container === \"centered\" ? (\n <main className=\"min-h-svh bg-lt-bg text-lt-fg\">\n <div\n data-test=\"lattice-centered-container\"\n className=\"mx-auto flex min-h-svh w-full max-w-6xl flex-col justify-center px-6 py-12 sm:px-8 lg:px-10\"\n >\n {content}\n </div>\n </main>\n ) : (\n <div\n data-test=\"lattice-default-container\"\n className={cn(\"w-full\", {\n \"px-4 py-6\": lattice.layout !== null,\n })}\n >\n {content}\n </div>\n )}\n </>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"page.js","names":[],"sources":["../resources/js/page.tsx"],"sourcesContent":["import { Head } from \"@inertiajs/react\";\nimport { Renderer } from \"@lattice-php/lattice/core/renderer\";\nimport type { PagePayload } from \"@lattice-php/lattice\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { RealtimeListeners } from \"@lattice-php/lattice/realtime/listeners\";\n\ntype Props = {\n lattice: PagePayload;\n};\n\nexport default function Page({ lattice }: Props) {\n const content = <Renderer nodes={lattice.schema} />;\n\n return (\n <>\n <Head title={lattice.title ?? undefined} />\n\n <RealtimeListeners listeners={lattice.listeners} />\n\n {lattice.container === \"centered\" ? (\n <main className=\"min-h-svh bg-lt-bg text-lt-fg\">\n <div\n data-test=\"lattice-centered-container\"\n className=\"mx-auto flex min-h-svh w-full max-w-6xl flex-col justify-center px-6 py-12 sm:px-8 lg:px-10\"\n >\n {content}\n </div>\n </main>\n ) : (\n <div\n data-test=\"lattice-default-container\"\n className={cn(\"w-full\", {\n \"px-4 py-6\": lattice.layout !== null,\n })}\n >\n {content}\n </div>\n )}\n </>\n );\n}\n"],"mappings":";;;;;;AAUA,SAAwB,KAAK,EAAE,WAAkB;CAC/C,MAAM,UAAU,oBAAC,UAAD,EAAU,OAAO,QAAQ,OAAS,CAAA;CAElD,OACE,qBAAA,UAAA,EAAA,UAAA;EACE,oBAAC,MAAD,EAAM,OAAO,QAAQ,SAAS,KAAA,EAAY,CAAA;EAE1C,oBAAC,mBAAD,EAAmB,WAAW,QAAQ,UAAY,CAAA;EAEjD,QAAQ,cAAc,aACrB,oBAAC,QAAD;GAAM,WAAU;aACd,oBAAC,OAAD;IACE,aAAU;IACV,WAAU;cAET;GACE,CAAA;EACD,CAAA,IAEN,oBAAC,OAAD;GACE,aAAU;GACV,WAAW,GAAG,UAAU,EACtB,aAAa,QAAQ,WAAW,KAClC,CAAC;aAEA;EACE,CAAA;CAEP,EAAA,CAAA;AAEN"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Effect } from '../types/generated';
|
|
2
|
+
import { Translate } from '../i18n/translatable';
|
|
3
|
+
export type RawEffect = Record<string, unknown>;
|
|
4
|
+
export declare function buildEffects(effects: readonly RawEffect[], payload: Record<string, unknown>, t: Translate): Effect[];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { isTranslatable, resolveTranslatable } from "../i18n/translatable.js";
|
|
2
|
+
//#region resources/js/realtime/build-effects.ts
|
|
3
|
+
function buildEffects(effects, payload, t) {
|
|
4
|
+
return effects.map((effect) => resolveEffect(effect, payload, t));
|
|
5
|
+
}
|
|
6
|
+
function resolveEffect(effect, payload, t) {
|
|
7
|
+
if (effect.type !== "toast") return effect;
|
|
8
|
+
const toast = effect.toast;
|
|
9
|
+
if (typeof toast !== "object" || toast === null) return effect;
|
|
10
|
+
const message = toast.message;
|
|
11
|
+
if (!isTranslatable(message)) return effect;
|
|
12
|
+
return {
|
|
13
|
+
...effect,
|
|
14
|
+
toast: {
|
|
15
|
+
...toast,
|
|
16
|
+
message: resolveTranslatable(message, payload, t)
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { buildEffects };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=build-effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-effects.js","names":[],"sources":["../../resources/js/realtime/build-effects.ts"],"sourcesContent":["import type { Effect } from \"@lattice-php/lattice/types/generated\";\nimport { isTranslatable, resolveTranslatable } from \"@lattice-php/lattice/i18n/translatable\";\nimport type { Translate } from \"@lattice-php/lattice/i18n/translatable\";\n\nexport type RawEffect = Record<string, unknown>;\n\nexport function buildEffects(\n effects: readonly RawEffect[],\n payload: Record<string, unknown>,\n t: Translate,\n): Effect[] {\n return effects.map((effect) => resolveEffect(effect, payload, t)) as Effect[];\n}\n\nfunction resolveEffect(\n effect: RawEffect,\n payload: Record<string, unknown>,\n t: Translate,\n): RawEffect {\n if (effect.type !== \"toast\") {\n return effect;\n }\n\n const toast = effect.toast;\n\n if (typeof toast !== \"object\" || toast === null) {\n return effect;\n }\n\n const message = (toast as Record<string, unknown>).message;\n\n if (!isTranslatable(message)) {\n return effect;\n }\n\n return {\n ...effect,\n toast: {\n ...(toast as Record<string, unknown>),\n message: resolveTranslatable(message, payload, t),\n },\n };\n}\n"],"mappings":";;AAMA,SAAgB,aACd,SACA,SACA,GACU;CACV,OAAO,QAAQ,KAAK,WAAW,cAAc,QAAQ,SAAS,CAAC,CAAC;AAClE;AAEA,SAAS,cACP,QACA,SACA,GACW;CACX,IAAI,OAAO,SAAS,SAClB,OAAO;CAGT,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,MAAM,UAAW,MAAkC;CAEnD,IAAI,CAAC,eAAe,OAAO,GACzB,OAAO;CAGT,OAAO;EACL,GAAG;EACH,OAAO;GACL,GAAI;GACJ,SAAS,oBAAoB,SAAS,SAAS,CAAC;EAClD;CACF;AACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ListenerPayload } from '../types/generated';
|
|
2
|
+
/**
|
|
3
|
+
* Renders nothing when a page declares no listeners, so the echo-react chunk
|
|
4
|
+
* is only fetched where it is actually needed.
|
|
5
|
+
*/
|
|
6
|
+
export declare function RealtimeListeners({ listeners }: {
|
|
7
|
+
listeners?: ListenerPayload[];
|
|
8
|
+
}): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Component, Suspense, lazy } from "react";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
//#region resources/js/realtime/listeners.tsx
|
|
4
|
+
var Subscriptions = lazy(() => import("./subscriptions.js"));
|
|
5
|
+
var EchoBoundary = class extends Component {
|
|
6
|
+
state = { failed: false };
|
|
7
|
+
static getDerivedStateFromError() {
|
|
8
|
+
return { failed: true };
|
|
9
|
+
}
|
|
10
|
+
componentDidCatch() {
|
|
11
|
+
console.warn("[lattice] Real-time listeners are declared but Echo is unavailable. Install @laravel/echo-react and call configureEcho().");
|
|
12
|
+
}
|
|
13
|
+
render() {
|
|
14
|
+
return this.state.failed ? null : this.props.children;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Renders nothing when a page declares no listeners, so the echo-react chunk
|
|
19
|
+
* is only fetched where it is actually needed.
|
|
20
|
+
*/
|
|
21
|
+
function RealtimeListeners({ listeners }) {
|
|
22
|
+
if (listeners === void 0 || listeners.length === 0) return null;
|
|
23
|
+
return /* @__PURE__ */ jsx(EchoBoundary, { children: /* @__PURE__ */ jsx(Suspense, {
|
|
24
|
+
fallback: null,
|
|
25
|
+
children: /* @__PURE__ */ jsx(Subscriptions, { listeners })
|
|
26
|
+
}) });
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
export { RealtimeListeners };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=listeners.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listeners.js","names":[],"sources":["../../resources/js/realtime/listeners.tsx"],"sourcesContent":["import { Component, lazy, Suspense } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { ListenerPayload } from \"@lattice-php/lattice/types/generated\";\n\nconst Subscriptions = lazy(() => import(\"./subscriptions\"));\n\nclass EchoBoundary extends Component<{ children: ReactNode }, { failed: boolean }> {\n state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n componentDidCatch(): void {\n console.warn(\n \"[lattice] Real-time listeners are declared but Echo is unavailable. Install @laravel/echo-react and call configureEcho().\",\n );\n }\n\n render(): ReactNode {\n return this.state.failed ? null : this.props.children;\n }\n}\n\n/**\n * Renders nothing when a page declares no listeners, so the echo-react chunk\n * is only fetched where it is actually needed.\n */\nexport function RealtimeListeners({ listeners }: { listeners?: ListenerPayload[] }) {\n if (listeners === undefined || listeners.length === 0) {\n return null;\n }\n\n return (\n <EchoBoundary>\n <Suspense fallback={null}>\n <Subscriptions listeners={listeners} />\n </Suspense>\n </EchoBoundary>\n );\n}\n"],"mappings":";;;AAIA,IAAM,gBAAgB,WAAW,OAAO,qBAAkB;AAE1D,IAAM,eAAN,cAA2B,UAAwD;CACjF,QAAQ,EAAE,QAAQ,MAAM;CAExB,OAAO,2BAAgD;EACrD,OAAO,EAAE,QAAQ,KAAK;CACxB;CAEA,oBAA0B;EACxB,QAAQ,KACN,2HACF;CACF;CAEA,SAAoB;EAClB,OAAO,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM;CAC/C;AACF;;;;;AAMA,SAAgB,kBAAkB,EAAE,aAAgD;CAClF,IAAI,cAAc,KAAA,KAAa,UAAU,WAAW,GAClD,OAAO;CAGT,OACE,oBAAC,cAAD,EAAA,UACE,oBAAC,UAAD;EAAU,UAAU;YAClB,oBAAC,eAAD,EAA0B,UAAY,CAAA;CAC9B,CAAA,EACE,CAAA;AAElB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useT } from "../i18n/instance.js";
|
|
2
|
+
import { useEffectDispatcher } from "../effects/use-effect-dispatcher.js";
|
|
3
|
+
import { buildEffects } from "./build-effects.js";
|
|
4
|
+
import { useCallback } from "react";
|
|
5
|
+
import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
|
|
6
|
+
import { useEcho, useEchoPresence, useEchoPublic } from "@laravel/echo-react";
|
|
7
|
+
//#region resources/js/realtime/subscriptions.tsx
|
|
8
|
+
function useListenerHandler(listener) {
|
|
9
|
+
const { t } = useT("lattice");
|
|
10
|
+
const dispatch = useEffectDispatcher();
|
|
11
|
+
return useCallback((payload) => {
|
|
12
|
+
const data = typeof payload === "object" && payload !== null ? payload : {};
|
|
13
|
+
dispatch(buildEffects(listener.effects, data, t));
|
|
14
|
+
}, [
|
|
15
|
+
dispatch,
|
|
16
|
+
listener,
|
|
17
|
+
t
|
|
18
|
+
]);
|
|
19
|
+
}
|
|
20
|
+
function PublicListener({ listener }) {
|
|
21
|
+
useEchoPublic(listener.channel, listener.events, useListenerHandler(listener));
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
function PrivateListener({ listener }) {
|
|
25
|
+
useEcho(listener.channel, listener.events, useListenerHandler(listener));
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
function PresenceListener({ listener }) {
|
|
29
|
+
useEchoPresence(listener.channel, listener.events, useListenerHandler(listener));
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
function Listener({ listener }) {
|
|
33
|
+
switch (listener.visibility) {
|
|
34
|
+
case "private": return /* @__PURE__ */ jsx(PrivateListener, { listener });
|
|
35
|
+
case "presence": return /* @__PURE__ */ jsx(PresenceListener, { listener });
|
|
36
|
+
default: return /* @__PURE__ */ jsx(PublicListener, { listener });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function Subscriptions({ listeners }) {
|
|
40
|
+
return /* @__PURE__ */ jsx(Fragment$1, { children: listeners.map((listener, index) => /* @__PURE__ */ jsx(Listener, { listener }, `${listener.visibility}:${listener.channel}:${index}`)) });
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
export { Subscriptions as default };
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=subscriptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptions.js","names":[],"sources":["../../resources/js/realtime/subscriptions.tsx"],"sourcesContent":["import { useEcho, useEchoPresence, useEchoPublic } from \"@laravel/echo-react\";\nimport { useCallback } from \"react\";\nimport { useEffectDispatcher } from \"@lattice-php/lattice/effects/use-effect-dispatcher\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { buildEffects } from \"./build-effects\";\nimport type { RawEffect } from \"./build-effects\";\nimport type { ListenerPayload } from \"@lattice-php/lattice/types/generated\";\n\nfunction useListenerHandler(listener: ListenerPayload): (payload: unknown) => void {\n const { t } = useT(\"lattice\");\n const dispatch = useEffectDispatcher();\n\n return useCallback(\n (payload: unknown) => {\n const data = (typeof payload === \"object\" && payload !== null ? payload : {}) as Record<\n string,\n unknown\n >;\n dispatch(buildEffects(listener.effects as unknown as RawEffect[], data, t));\n },\n [dispatch, listener, t],\n );\n}\n\nfunction PublicListener({ listener }: { listener: ListenerPayload }) {\n useEchoPublic(listener.channel, listener.events, useListenerHandler(listener));\n return null;\n}\n\nfunction PrivateListener({ listener }: { listener: ListenerPayload }) {\n useEcho(listener.channel, listener.events, useListenerHandler(listener));\n return null;\n}\n\nfunction PresenceListener({ listener }: { listener: ListenerPayload }) {\n useEchoPresence(listener.channel, listener.events, useListenerHandler(listener));\n return null;\n}\n\nfunction Listener({ listener }: { listener: ListenerPayload }) {\n switch (listener.visibility) {\n case \"private\":\n return <PrivateListener listener={listener} />;\n case \"presence\":\n return <PresenceListener listener={listener} />;\n default:\n return <PublicListener listener={listener} />;\n }\n}\n\nexport default function Subscriptions({ listeners }: { listeners: ListenerPayload[] }) {\n return (\n <>\n {listeners.map((listener, index) => (\n <Listener key={`${listener.visibility}:${listener.channel}:${index}`} listener={listener} />\n ))}\n </>\n );\n}\n"],"mappings":";;;;;;;AAQA,SAAS,mBAAmB,UAAuD;CACjF,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,WAAW,oBAAoB;CAErC,OAAO,aACJ,YAAqB;EACpB,MAAM,OAAQ,OAAO,YAAY,YAAY,YAAY,OAAO,UAAU,CAAC;EAI3E,SAAS,aAAa,SAAS,SAAmC,MAAM,CAAC,CAAC;CAC5E,GACA;EAAC;EAAU;EAAU;CAAC,CACxB;AACF;AAEA,SAAS,eAAe,EAAE,YAA2C;CACnE,cAAc,SAAS,SAAS,SAAS,QAAQ,mBAAmB,QAAQ,CAAC;CAC7E,OAAO;AACT;AAEA,SAAS,gBAAgB,EAAE,YAA2C;CACpE,QAAQ,SAAS,SAAS,SAAS,QAAQ,mBAAmB,QAAQ,CAAC;CACvE,OAAO;AACT;AAEA,SAAS,iBAAiB,EAAE,YAA2C;CACrE,gBAAgB,SAAS,SAAS,SAAS,QAAQ,mBAAmB,QAAQ,CAAC;CAC/E,OAAO;AACT;AAEA,SAAS,SAAS,EAAE,YAA2C;CAC7D,QAAQ,SAAS,YAAjB;EACE,KAAK,WACH,OAAO,oBAAC,iBAAD,EAA2B,SAAW,CAAA;EAC/C,KAAK,YACH,OAAO,oBAAC,kBAAD,EAA4B,SAAW,CAAA;EAChD,SACE,OAAO,oBAAC,gBAAD,EAA0B,SAAW,CAAA;CAChD;AACF;AAEA,SAAwB,cAAc,EAAE,aAA+C;CACrF,OACE,oBAAA,YAAA,EAAA,UACG,UAAU,KAAK,UAAU,UACxB,oBAAC,UAAD,EAAgF,SAAW,GAA5E,GAAG,SAAS,WAAW,GAAG,SAAS,QAAQ,GAAG,OAA8B,CAC5F,EACD,CAAA;AAEN"}
|
package/dist/registry.js
CHANGED
|
@@ -3,10 +3,11 @@ import { actionComponents } from "./action/index.js";
|
|
|
3
3
|
import { chatPlugin } from "./chat/index.js";
|
|
4
4
|
import { coreComponents } from "./core/components/index.js";
|
|
5
5
|
import { formComponents } from "./form/index.js";
|
|
6
|
+
import { remoteComponents } from "./remote/index.js";
|
|
6
7
|
import { layoutComponents } from "./layout/components.js";
|
|
7
8
|
import { tableComponents } from "./table/index.js";
|
|
8
9
|
//#region resources/js/registry.ts
|
|
9
|
-
var registry = createRegistry(coreComponents, actionComponents, formComponents, layoutComponents, tableComponents, chatPlugin);
|
|
10
|
+
var registry = createRegistry(coreComponents, actionComponents, formComponents, layoutComponents, tableComponents, chatPlugin, remoteComponents);
|
|
10
11
|
//#endregion
|
|
11
12
|
export { registry };
|
|
12
13
|
|