@lattice-php/lattice 0.24.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/action/components/action-form.js +37 -5
  2. package/dist/action/components/action-form.js.map +1 -1
  3. package/dist/action/components/action-group.js +1 -1
  4. package/dist/action/components/action-group.js.map +1 -1
  5. package/dist/action/components/action.js +3 -2
  6. package/dist/action/components/action.js.map +1 -1
  7. package/dist/action/hooks/use-action.js +2 -1
  8. package/dist/action/hooks/use-action.js.map +1 -1
  9. package/dist/appearance/index.d.ts +1 -1
  10. package/dist/appearance/index.js +8 -8
  11. package/dist/appearance/index.js.map +1 -1
  12. package/dist/chat/components/prompt-input.js +1 -2
  13. package/dist/chat/components/prompt-input.js.map +1 -1
  14. package/dist/create-app.js +2 -2
  15. package/dist/create-app.js.map +1 -1
  16. package/dist/form/components/base/submit-button.d.ts +4 -3
  17. package/dist/form/components/base/submit-button.js +2 -1
  18. package/dist/form/components/base/submit-button.js.map +1 -1
  19. package/dist/form/components/fields/date-picker-field.js +3 -3
  20. package/dist/form/components/fields/date-picker-field.js.map +1 -1
  21. package/dist/form/components/fields/number-input.js +1 -1
  22. package/dist/form/components/fields/number-input.js.map +1 -1
  23. package/dist/form/components/fields/rich-editor-field.js +1 -1
  24. package/dist/form/components/fields/rich-editor-field.js.map +1 -1
  25. package/dist/form/components/fields/row-action-menu.js +3 -3
  26. package/dist/form/components/fields/row-action-menu.js.map +1 -1
  27. package/dist/form/components/fields/row-actions.d.ts +1 -1
  28. package/dist/form/components/fields/row-actions.js +4 -4
  29. package/dist/form/components/fields/row-actions.js.map +1 -1
  30. package/dist/form/components/fields/toggle.js +1 -1
  31. package/dist/form/components/fields/toggle.js.map +1 -1
  32. package/dist/form/components/form.js +15 -5
  33. package/dist/form/components/form.js.map +1 -1
  34. package/dist/form/components/index.d.ts +1 -0
  35. package/dist/form/components/index.js +2 -1
  36. package/dist/form/components/wizard.d.ts +3 -0
  37. package/dist/form/components/wizard.js +148 -0
  38. package/dist/form/components/wizard.js.map +1 -0
  39. package/dist/form/embed.d.ts +1 -1
  40. package/dist/form/embed.js +2 -2
  41. package/dist/form/hooks/context.d.ts +7 -2
  42. package/dist/form/hooks/context.js +4 -1
  43. package/dist/form/hooks/context.js.map +1 -1
  44. package/dist/form/index.js +2 -1
  45. package/dist/form/lib/field-errors.d.ts +2 -0
  46. package/dist/form/lib/field-errors.js +5 -1
  47. package/dist/form/lib/field-errors.js.map +1 -1
  48. package/dist/form/lib/field-props.d.ts +6 -0
  49. package/dist/form/lib/field-props.js +7 -1
  50. package/dist/form/lib/field-props.js.map +1 -1
  51. package/dist/form/lib/prefill-targets.js +2 -3
  52. package/dist/form/lib/prefill-targets.js.map +1 -1
  53. package/dist/form/lib/wizard-steps.d.ts +5 -0
  54. package/dist/form/lib/wizard-steps.js +44 -0
  55. package/dist/form/lib/wizard-steps.js.map +1 -0
  56. package/dist/form/plugin.js +4 -1
  57. package/dist/form/plugin.js.map +1 -1
  58. package/dist/i18n/translatable.d.ts +1 -0
  59. package/dist/i18n/translatable.js +4 -1
  60. package/dist/i18n/translatable.js.map +1 -1
  61. package/dist/index.d.ts +2 -2
  62. package/dist/index.js +2 -2
  63. package/dist/lattice.css +183 -115
  64. package/dist/layout/components/callouts.js +3 -2
  65. package/dist/layout/components/callouts.js.map +1 -1
  66. package/dist/notifications/components/notification-item.js +10 -5
  67. package/dist/notifications/components/notification-item.js.map +1 -1
  68. package/dist/notifications/components/notifications.js +2 -4
  69. package/dist/notifications/components/notifications.js.map +1 -1
  70. package/dist/table/components/bulk-bar.js +2 -0
  71. package/dist/table/components/bulk-bar.js.map +1 -1
  72. package/dist/table/components/cells/badge-cell.js +3 -6
  73. package/dist/table/components/cells/badge-cell.js.map +1 -1
  74. package/dist/table/components/cells/text-cell.js +6 -9
  75. package/dist/table/components/cells/text-cell.js.map +1 -1
  76. package/dist/table/components/column-filter-control.js +2 -2
  77. package/dist/table/components/column-filter-control.js.map +1 -1
  78. package/dist/table/components/filter-bar.js +1 -1
  79. package/dist/table/components/filter-bar.js.map +1 -1
  80. package/dist/table/components/filter-controls.js +4 -1
  81. package/dist/table/components/filter-controls.js.map +1 -1
  82. package/dist/table/components/pagination.js +6 -6
  83. package/dist/table/components/pagination.js.map +1 -1
  84. package/dist/table/lib/bulk.d.ts +3 -2
  85. package/dist/table/lib/bulk.js +2 -1
  86. package/dist/table/lib/bulk.js.map +1 -1
  87. package/dist/toast/callout.js +6 -3
  88. package/dist/toast/callout.js.map +1 -1
  89. package/dist/toast/toast.js +3 -1
  90. package/dist/toast/toast.js.map +1 -1
  91. package/dist/toast/toaster.js +2 -2
  92. package/dist/toast/toaster.js.map +1 -1
  93. package/dist/toast/variant-styles.js +15 -1
  94. package/dist/toast/variant-styles.js.map +1 -1
  95. package/dist/types/generated.d.ts +31 -16
  96. package/dist/ui/action-menu-context.d.ts +1 -1
  97. package/dist/ui/action-menu-context.js +1 -1
  98. package/dist/ui/action-menu-context.js.map +1 -1
  99. package/dist/ui/affix-group.js +1 -1
  100. package/dist/ui/affix-group.js.map +1 -1
  101. package/dist/ui/badge.d.ts +4 -7
  102. package/dist/ui/badge.js +11 -17
  103. package/dist/ui/badge.js.map +1 -1
  104. package/dist/ui/button.d.ts +6 -5
  105. package/dist/ui/button.js +154 -15
  106. package/dist/ui/button.js.map +1 -1
  107. package/dist/ui/chart-view.js +9 -7
  108. package/dist/ui/chart-view.js.map +1 -1
  109. package/dist/ui/checkbox.js +1 -1
  110. package/dist/ui/checkbox.js.map +1 -1
  111. package/dist/ui/confirm-dialog.d.ts +4 -3
  112. package/dist/ui/confirm-dialog.js +3 -2
  113. package/dist/ui/confirm-dialog.js.map +1 -1
  114. package/dist/ui/control.d.ts +1 -1
  115. package/dist/ui/control.js +1 -1
  116. package/dist/ui/control.js.map +1 -1
  117. package/dist/ui/dialog.js +1 -1
  118. package/dist/ui/dialog.js.map +1 -1
  119. package/dist/ui/dropdown-menu.d.ts +2 -2
  120. package/dist/ui/dropdown-menu.js +2 -2
  121. package/dist/ui/dropdown-menu.js.map +1 -1
  122. package/dist/ui/icon-button.d.ts +3 -3
  123. package/dist/ui/icon-button.js +6 -6
  124. package/dist/ui/icon-button.js.map +1 -1
  125. package/dist/ui/image-preview.js +1 -1
  126. package/dist/ui/image-preview.js.map +1 -1
  127. package/dist/ui/index.d.ts +2 -2
  128. package/dist/ui/index.js +2 -2
  129. package/dist/ui/info-tooltip.js +1 -1
  130. package/dist/ui/info-tooltip.js.map +1 -1
  131. package/dist/ui/input-otp.js +1 -1
  132. package/dist/ui/input-otp.js.map +1 -1
  133. package/dist/ui/label.js +1 -1
  134. package/dist/ui/label.js.map +1 -1
  135. package/dist/ui/password-input.js +1 -1
  136. package/dist/ui/password-input.js.map +1 -1
  137. package/dist/ui/progress.js +2 -2
  138. package/dist/ui/progress.js.map +1 -1
  139. package/dist/ui/text.js +1 -1
  140. package/dist/ui/tooltip.js +1 -1
  141. package/dist/ui/tooltip.js.map +1 -1
  142. package/dist/vite-typescript-refresh.d.ts +9 -0
  143. package/dist/vite-typescript-refresh.js +47 -0
  144. package/dist/vite-typescript-refresh.js.map +1 -0
  145. package/dist/vite.d.ts +22 -1
  146. package/dist/vite.js +60 -7
  147. package/dist/vite.js.map +1 -1
  148. package/dist-standalone/chunks/{chart-view-DEwGTt9d.js → chart-view-8xEKTUJV.js} +1 -1
  149. package/dist-standalone/chunks/{date-picker-field-CCQ9nWx0.js → date-picker-field-cdhxtVSG.js} +1 -1
  150. package/dist-standalone/chunks/{rich-editor-field-B9Nv1qia.js → rich-editor-field-47ov3Bny.js} +1 -1
  151. package/dist-standalone/lattice.css +1 -1
  152. package/dist-standalone/lattice.js +15 -15
  153. package/dist-standalone/manifest.json +5 -5
  154. package/package.json +1 -1
package/dist/lattice.css CHANGED
@@ -1,49 +1,83 @@
1
1
  @source "./**/*.js";
2
2
 
3
- :root,
4
- [data-theme="light"] {
5
- --lt-bg: var(--background, oklch(0.97 0 0));
6
- --lt-fg: var(--foreground, oklch(0.145 0 0));
7
- --lt-surface: var(--card, oklch(1 0 0));
8
- --lt-surface-fg: var(--card-foreground, oklch(0.145 0 0));
9
- --lt-popover: var(--popover, oklch(1 0 0));
10
- --lt-popover-fg: var(--popover-foreground, oklch(0.145 0 0));
11
- --lt-primary: var(--primary, oklch(0.48 0.092 182));
12
- --lt-primary-fg: var(--primary-foreground, oklch(0.985 0 0));
13
- --lt-secondary: var(--secondary, oklch(0.97 0 0));
14
- --lt-secondary-fg: var(--secondary-foreground, oklch(0.205 0 0));
15
- --lt-muted: var(--muted, oklch(0.97 0 0));
16
- --lt-muted-fg: var(--muted-foreground, oklch(0.556 0 0));
17
- --lt-accent: var(--accent, oklch(0.965 0.013 182));
18
- --lt-accent-fg: var(--accent-foreground, oklch(0.4 0.07 182));
19
- --lt-danger: var(--destructive, oklch(0.585 0.21 27.3));
20
- --lt-danger-fg: var(--destructive-foreground, oklch(0.985 0 0));
21
- --lt-border: var(--border, oklch(0.922 0 0));
22
- --lt-input: var(--input, oklch(0.922 0 0));
23
- --lt-ring: var(--ring, oklch(0.72 0.075 182));
24
- --lt-overlay: var(--overlay, oklch(0 0 0 / 0.5));
25
- --lt-warning: var(--warning, oklch(0.84 0.14 88));
26
- --lt-success: var(--success, oklch(0.62 0.125 160));
27
- --lt-success-fg: var(--success-foreground, oklch(0.985 0 0));
28
- --lt-info: var(--info, oklch(0.62 0.14 240));
29
- --lt-info-fg: var(--info-foreground, oklch(0.985 0 0));
30
- --lt-primary-hover: var(--primary-hover, oklch(0.43 0.092 182));
31
- --lt-primary-active: var(--primary-active, oklch(0.39 0.092 182));
32
- --lt-danger-hover: var(--destructive-hover, oklch(0.53 0.21 27.3));
33
- --lt-danger-active: var(--destructive-active, oklch(0.48 0.21 27.3));
34
- --lt-success-hover: var(--success-hover, oklch(0.57 0.125 160));
35
- --lt-success-active: var(--success-active, oklch(0.52 0.125 160));
36
- --lt-info-hover: var(--info-hover, oklch(0.57 0.14 240));
37
- --lt-info-active: var(--info-active, oklch(0.52 0.14 240));
38
- --lt-secondary-hover: var(--secondary-hover, oklch(0.93 0 0));
39
- --lt-secondary-active: var(--secondary-active, oklch(0.9 0 0));
40
- --lt-disabled: var(--disabled, oklch(0.95 0 0));
41
- --lt-disabled-fg: var(--disabled-foreground, oklch(0.7 0 0));
3
+ /*
4
+ * Token defaults live in a cascade layer so any unlayered override wins
5
+ * regardless of stylesheet order — the @latticeTheme style tag and plain
6
+ * `:root { --lt-primary: }` rules in an app's CSS both take precedence.
7
+ */
8
+ @layer lattice {
9
+ :root,
10
+ [data-theme="light"] {
11
+ --lt-bg: oklch(0.976 0.003 210);
12
+ --lt-fg: oklch(0.18 0.01 220);
13
+ --lt-surface: oklch(1 0 0);
14
+ --lt-surface-fg: oklch(0.18 0.01 220);
15
+ --lt-popover: oklch(1 0 0);
16
+ --lt-popover-fg: oklch(0.18 0.01 220);
17
+ --lt-primary: oklch(0.51 0.12 195);
18
+ --lt-primary-fg: oklch(0.985 0 0);
19
+ --lt-secondary: oklch(0.955 0.005 210);
20
+ --lt-secondary-fg: oklch(0.25 0.012 220);
21
+ --lt-muted: oklch(0.955 0.004 210);
22
+ --lt-muted-fg: oklch(0.52 0.015 220);
23
+ --lt-accent: oklch(0.95 0.024 195);
24
+ --lt-accent-fg: oklch(0.36 0.085 195);
25
+ --lt-danger: oklch(0.55 0.2 26);
26
+ --lt-danger-fg: oklch(0.985 0 0);
27
+ --lt-border: oklch(0.915 0.005 210);
28
+ --lt-input: oklch(0.88 0.007 210);
29
+ --lt-ring: oklch(0.7 0.1 195);
30
+ --lt-overlay: oklch(0.15 0.02 225 / 0.5);
31
+ --lt-warning: oklch(0.83 0.15 85);
32
+ --lt-success: oklch(0.56 0.13 158);
33
+ --lt-success-fg: oklch(0.985 0 0);
34
+ --lt-info: oklch(0.55 0.13 245);
35
+ --lt-info-fg: oklch(0.985 0 0);
36
+ --lt-primary-hover: oklch(0.46 0.12 195);
37
+ --lt-primary-active: oklch(0.41 0.12 195);
38
+ --lt-danger-hover: oklch(0.5 0.2 26);
39
+ --lt-danger-active: oklch(0.45 0.2 26);
40
+ --lt-success-hover: oklch(0.51 0.13 158);
41
+ --lt-success-active: oklch(0.47 0.13 158);
42
+ --lt-info-hover: oklch(0.5 0.13 245);
43
+ --lt-info-active: oklch(0.46 0.13 245);
44
+ --lt-warning-hover: oklch(0.78 0.15 85);
45
+ --lt-warning-active: oklch(0.73 0.15 85);
46
+ --lt-secondary-hover: oklch(0.925 0.006 210);
47
+ --lt-secondary-active: oklch(0.9 0.007 210);
48
+ --lt-disabled: oklch(0.945 0.003 210);
49
+ --lt-disabled-fg: oklch(0.68 0.008 220);
42
50
 
43
51
  /* Radius: base = cards, -sm = controls, -xs = chips */
44
- --lt-radius: var(--radius, 0.5rem);
52
+ --lt-radius: 0.5rem;
45
53
  --lt-radius-sm: calc(var(--lt-radius) - 0.125rem);
46
54
  --lt-radius-xs: calc(var(--lt-radius) - 0.25rem);
55
+ --lt-radius-lg: calc(var(--lt-radius) + 0.25rem);
56
+ --lt-radius-xl: calc(var(--lt-radius) + 0.5rem);
57
+ --lt-radius-full: 9999px;
58
+
59
+ --lt-ring-width: 3px;
60
+ --lt-ring-offset: 0px;
61
+
62
+ --lt-font-sans:
63
+ "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
64
+ "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
65
+ "Segoe UI Symbol", "Noto Color Emoji";
66
+ --lt-font-mono: ui-monospace, "SFMono-Regular", "Menlo", monospace;
67
+ --lt-font-display: var(--lt-font-sans);
68
+
69
+ --lt-warning-fg: oklch(0.28 0.06 70);
70
+
71
+ --lt-shadow-inner: inset 0 1px 2px 0 oklch(0.2 0.02 225 / 0.06);
72
+
73
+ --lt-chart-1: oklch(0.55 0.12 195);
74
+ --lt-chart-2: oklch(0.58 0.14 250);
75
+ --lt-chart-3: oklch(0.68 0.14 60);
76
+ --lt-chart-4: oklch(0.58 0.19 305);
77
+ --lt-chart-5: oklch(0.6 0.16 20);
78
+ --lt-chart-6: oklch(0.62 0.13 150);
79
+ --lt-chart-7: oklch(0.6 0.13 100);
80
+ --lt-chart-8: oklch(0.55 0.05 280);
47
81
 
48
82
  --lt-icon-xs: 0.75rem;
49
83
  --lt-icon-sm: 0.875rem;
@@ -69,12 +103,12 @@
69
103
  --lt-font-weight-semibold: 600;
70
104
  --lt-font-weight-bold: 700;
71
105
 
72
- --lt-shadow-xs: 0 1px 1px 0 oklch(0 0 0 / 0.04);
73
- --lt-shadow-sm: 0 1px 2px 0 oklch(0 0 0 / 0.05);
106
+ --lt-shadow-xs: 0 1px 1px 0 oklch(0.2 0.02 225 / 0.05);
107
+ --lt-shadow-sm: 0 1px 2px 0 oklch(0.2 0.02 225 / 0.06);
74
108
  --lt-shadow-md:
75
- 0 2px 4px -1px oklch(0 0 0 / 0.08), 0 1px 2px -1px oklch(0 0 0 / 0.06);
109
+ 0 2px 4px -1px oklch(0.2 0.02 225 / 0.09), 0 1px 2px -1px oklch(0.2 0.02 225 / 0.06);
76
110
  --lt-shadow-lg:
77
- 0 8px 16px -4px oklch(0 0 0 / 0.12), 0 2px 4px -2px oklch(0 0 0 / 0.08);
111
+ 0 8px 16px -4px oklch(0.2 0.02 225 / 0.13), 0 2px 4px -2px oklch(0.2 0.02 225 / 0.08);
78
112
 
79
113
  --lt-z-dropdown: 1000;
80
114
  --lt-z-sticky: 1100;
@@ -95,6 +129,7 @@
95
129
  --lt-gutter: calc(var(--spacing) * 6);
96
130
 
97
131
  color-scheme: light;
132
+ }
98
133
  }
99
134
 
100
135
  /*
@@ -111,51 +146,66 @@
111
146
  }
112
147
  }
113
148
 
114
- [data-theme="dark"],
115
- .dark {
116
- --lt-bg: var(--background, oklch(0.145 0 0));
117
- --lt-fg: var(--foreground, oklch(0.985 0 0));
118
- --lt-surface: var(--card, oklch(0.145 0 0));
119
- --lt-surface-fg: var(--card-foreground, oklch(0.985 0 0));
120
- --lt-popover: var(--popover, oklch(0.145 0 0));
121
- --lt-popover-fg: var(--popover-foreground, oklch(0.985 0 0));
122
- --lt-primary: var(--primary, oklch(0.74 0.105 182));
123
- --lt-primary-fg: var(--primary-foreground, oklch(0.2 0.025 182));
124
- --lt-secondary: var(--secondary, oklch(0.269 0 0));
125
- --lt-secondary-fg: var(--secondary-foreground, oklch(0.985 0 0));
126
- --lt-muted: var(--muted, oklch(0.269 0 0));
127
- --lt-muted-fg: var(--muted-foreground, oklch(0.708 0 0));
128
- --lt-accent: var(--accent, oklch(0.278 0.018 182));
129
- --lt-accent-fg: var(--accent-foreground, oklch(0.985 0 0));
130
- --lt-danger: var(--destructive, oklch(0.42 0.13 26));
131
- --lt-danger-fg: var(--destructive-foreground, oklch(0.985 0 0));
132
- --lt-border: var(--border, oklch(0.269 0 0));
133
- --lt-input: var(--input, oklch(0.269 0 0));
134
- --lt-ring: var(--ring, oklch(0.55 0.08 182));
135
- --lt-overlay: var(--overlay, oklch(0 0 0 / 0.6));
136
- --lt-warning: var(--warning, oklch(0.7 0.13 78));
137
- --lt-success: var(--success, oklch(0.7 0.15 162));
138
- --lt-success-fg: var(--success-foreground, oklch(0.205 0 0));
139
- --lt-info: var(--info, oklch(0.7 0.14 240));
140
- --lt-info-fg: var(--info-foreground, oklch(0.205 0 0));
141
-
142
- --lt-primary-hover: var(--primary-hover, oklch(0.79 0.105 182));
143
- --lt-primary-active: var(--primary-active, oklch(0.84 0.105 182));
144
- --lt-danger-hover: var(--destructive-hover, oklch(0.47 0.13 26));
145
- --lt-danger-active: var(--destructive-active, oklch(0.52 0.13 26));
146
- --lt-success-hover: var(--success-hover, oklch(0.75 0.15 162));
147
- --lt-success-active: var(--success-active, oklch(0.8 0.15 162));
148
- --lt-info-hover: var(--info-hover, oklch(0.75 0.14 240));
149
- --lt-info-active: var(--info-active, oklch(0.8 0.14 240));
150
- --lt-secondary-hover: var(--secondary-hover, oklch(0.32 0 0));
151
- --lt-secondary-active: var(--secondary-active, oklch(0.36 0 0));
152
- --lt-disabled: var(--disabled, oklch(0.32 0 0));
153
- --lt-disabled-fg: var(--disabled-foreground, oklch(0.55 0 0));
149
+ @layer lattice {
150
+ [data-theme="dark"],
151
+ .dark {
152
+ --lt-bg: oklch(0.155 0.008 225);
153
+ --lt-fg: oklch(0.955 0.005 210);
154
+ --lt-surface: oklch(0.195 0.01 225);
155
+ --lt-surface-fg: oklch(0.955 0.005 210);
156
+ --lt-popover: oklch(0.225 0.012 225);
157
+ --lt-popover-fg: oklch(0.955 0.005 210);
158
+ --lt-primary: oklch(0.75 0.115 190);
159
+ --lt-primary-fg: oklch(0.17 0.03 195);
160
+ --lt-secondary: oklch(0.27 0.012 225);
161
+ --lt-secondary-fg: oklch(0.955 0.005 210);
162
+ --lt-muted: oklch(0.26 0.01 225);
163
+ --lt-muted-fg: oklch(0.72 0.012 220);
164
+ --lt-accent: oklch(0.29 0.03 195);
165
+ --lt-accent-fg: oklch(0.97 0.005 210);
166
+ --lt-danger: oklch(0.55 0.18 25);
167
+ --lt-danger-fg: oklch(0.985 0 0);
168
+ --lt-border: oklch(0.285 0.012 225);
169
+ --lt-input: oklch(0.33 0.014 225);
170
+ --lt-ring: oklch(0.6 0.1 192);
171
+ --lt-overlay: oklch(0.08 0.01 225 / 0.65);
172
+ --lt-warning: oklch(0.75 0.14 82);
173
+ --lt-success: oklch(0.72 0.14 160);
174
+ --lt-success-fg: oklch(0.2 0.04 160);
175
+ --lt-info: oklch(0.72 0.13 242);
176
+ --lt-info-fg: oklch(0.2 0.04 242);
177
+
178
+ --lt-primary-hover: oklch(0.79 0.115 190);
179
+ --lt-primary-active: oklch(0.83 0.11 190);
180
+ --lt-danger-hover: oklch(0.6 0.18 25);
181
+ --lt-danger-active: oklch(0.65 0.17 25);
182
+ --lt-success-hover: oklch(0.76 0.14 160);
183
+ --lt-success-active: oklch(0.8 0.13 160);
184
+ --lt-info-hover: oklch(0.76 0.13 242);
185
+ --lt-info-active: oklch(0.8 0.12 242);
186
+ --lt-warning-hover: oklch(0.79 0.14 82);
187
+ --lt-warning-active: oklch(0.83 0.13 82);
188
+ --lt-secondary-hover: oklch(0.31 0.013 225);
189
+ --lt-secondary-active: oklch(0.35 0.014 225);
190
+ --lt-disabled: oklch(0.28 0.01 225);
191
+ --lt-disabled-fg: oklch(0.56 0.012 225);
192
+
193
+ --lt-chart-1: oklch(0.72 0.12 190);
194
+ --lt-chart-2: oklch(0.7 0.12 250);
195
+ --lt-chart-3: oklch(0.76 0.14 60);
196
+ --lt-chart-4: oklch(0.7 0.16 305);
197
+ --lt-chart-5: oklch(0.7 0.16 20);
198
+ --lt-chart-6: oklch(0.74 0.12 150);
199
+ --lt-chart-7: oklch(0.72 0.12 100);
200
+ --lt-chart-8: oklch(0.68 0.05 280);
154
201
 
155
202
  color-scheme: dark;
203
+ }
156
204
  }
157
205
 
158
206
  @theme inline {
207
+ --font-sans: var(--lt-font-sans);
208
+ --font-mono: var(--lt-font-mono);
159
209
  --color-lt-bg: var(--lt-bg);
160
210
  --color-lt-fg: var(--lt-fg);
161
211
  --color-lt-surface: var(--lt-surface);
@@ -189,6 +239,8 @@
189
239
  --color-lt-success-active: var(--lt-success-active);
190
240
  --color-lt-info-hover: var(--lt-info-hover);
191
241
  --color-lt-info-active: var(--lt-info-active);
242
+ --color-lt-warning-hover: var(--lt-warning-hover);
243
+ --color-lt-warning-active: var(--lt-warning-active);
192
244
  --color-lt-secondary-hover: var(--lt-secondary-hover);
193
245
  --color-lt-secondary-active: var(--lt-secondary-active);
194
246
  --color-lt-disabled: var(--lt-disabled);
@@ -200,6 +252,24 @@
200
252
  --shadow-lt-sm: var(--lt-shadow-sm);
201
253
  --shadow-lt-md: var(--lt-shadow-md);
202
254
  --shadow-lt-lg: var(--lt-shadow-lg);
255
+ --shadow-lt-inner: var(--lt-shadow-inner);
256
+ --radius-lt-lg: var(--lt-radius-lg);
257
+ --radius-lt-xl: var(--lt-radius-xl);
258
+ --radius-lt-full: var(--lt-radius-full);
259
+ --color-lt-warning-fg: var(--lt-warning-fg);
260
+ --color-lt-chart-1: var(--lt-chart-1);
261
+ --color-lt-chart-2: var(--lt-chart-2);
262
+ --color-lt-chart-3: var(--lt-chart-3);
263
+ --color-lt-chart-4: var(--lt-chart-4);
264
+ --color-lt-chart-5: var(--lt-chart-5);
265
+ --color-lt-chart-6: var(--lt-chart-6);
266
+ --color-lt-chart-7: var(--lt-chart-7);
267
+ --color-lt-chart-8: var(--lt-chart-8);
268
+ --font-lt-mono: var(--lt-font-mono);
269
+ --font-lt-display: var(--lt-font-display);
270
+ --spacing-lt-sidebar: var(--lt-sidebar-w);
271
+ --spacing-lt-sidebar-collapsed: var(--lt-sidebar-w-collapsed);
272
+ --spacing-lt-container: var(--lt-container-max);
203
273
  --spacing-lt-icon-xs: var(--lt-icon-xs);
204
274
  --spacing-lt-icon-sm: var(--lt-icon-sm);
205
275
  --spacing-lt-icon-md: var(--lt-icon-md);
@@ -231,34 +301,30 @@
231
301
  }
232
302
 
233
303
  @theme {
234
- --font-sans:
235
- "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
236
- "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
237
- "Segoe UI Symbol", "Noto Color Emoji";
238
304
 
239
305
  --spacing: 0.25rem;
240
306
 
241
- --text-xs: 0.625rem;
242
- --text-xs--line-height: 1.6;
243
- --text-sm: 0.6875rem;
244
- --text-sm--line-height: 1.82;
245
- --text-base: 0.75rem;
246
- --text-base--line-height: 1.5;
247
- --text-lg: 0.875rem;
248
- --text-lg--line-height: 1.4286;
249
- --text-xl: 1rem;
250
- --text-xl--line-height: 1.5;
251
- --text-2xl: 1.125rem;
252
- --text-2xl--line-height: 1.2;
253
- --text-3xl: 1.25rem;
254
- --text-3xl--line-height: 1.2;
255
- --text-4xl: 1.5rem;
256
- --text-4xl--line-height: 1.2;
257
- --text-5xl: 1.875rem;
258
- --text-5xl--line-height: 1;
259
- --text-6xl: 2.25rem;
307
+ --text-xs: 0.75rem;
308
+ --text-xs--line-height: 1.5;
309
+ --text-sm: 0.8125rem;
310
+ --text-sm--line-height: 1.5385;
311
+ --text-base: 0.875rem;
312
+ --text-base--line-height: 1.5714;
313
+ --text-lg: 1rem;
314
+ --text-lg--line-height: 1.5;
315
+ --text-xl: 1.125rem;
316
+ --text-xl--line-height: 1.5556;
317
+ --text-2xl: 1.375rem;
318
+ --text-2xl--line-height: 1.2727;
319
+ --text-3xl: 1.625rem;
320
+ --text-3xl--line-height: 1.2308;
321
+ --text-4xl: 2rem;
322
+ --text-4xl--line-height: 1.25;
323
+ --text-5xl: 2.5rem;
324
+ --text-5xl--line-height: 1.1;
325
+ --text-6xl: 3rem;
260
326
  --text-6xl--line-height: 1;
261
- --text-7xl: 3rem;
327
+ --text-7xl: 3.75rem;
262
328
  --text-7xl--line-height: 1;
263
329
  }
264
330
 
@@ -399,7 +465,8 @@
399
465
  * theme and can be overridden, and so a colour can be picked by name at
400
466
  * runtime without Tailwind needing to see every class.
401
467
  */
402
- :root {
468
+ @layer lattice {
469
+ :root {
403
470
  --lt-color-default: var(--lt-fg);
404
471
  --lt-color-muted: var(--lt-muted-fg);
405
472
  --lt-color-primary: var(--lt-primary);
@@ -414,19 +481,20 @@
414
481
  --lt-color-green: oklch(0.52 0.13 152);
415
482
  --lt-color-blue: oklch(0.54 0.17 252);
416
483
  --lt-color-purple: oklch(0.53 0.19 305);
417
- }
484
+ }
418
485
 
419
- [data-theme="dark"],
420
- .dark {
486
+ [data-theme="dark"],
487
+ .dark {
421
488
  --lt-color-red: oklch(0.83 0.11 27);
422
489
  --lt-color-orange: oklch(0.84 0.1 65);
423
490
  --lt-color-yellow: oklch(0.87 0.11 100);
424
491
  --lt-color-green: oklch(0.85 0.13 155);
425
492
  --lt-color-blue: oklch(0.84 0.11 250);
426
493
  --lt-color-purple: oklch(0.85 0.11 305);
494
+ }
427
495
  }
428
496
 
429
- .lt-cell-badge {
497
+ .lt-badge {
430
498
  display: inline-flex;
431
499
  align-items: center;
432
500
  gap: 0.25rem;
@@ -631,7 +699,7 @@
631
699
  background: var(--lt-muted);
632
700
  border-radius: var(--lt-radius-sm);
633
701
  padding: calc(var(--spacing) * 0.5) var(--spacing);
634
- font-family: ui-monospace, "SFMono-Regular", "Menlo", monospace;
702
+ font-family: var(--lt-font-mono);
635
703
  font-size: 0.875em;
636
704
  }
637
705
 
@@ -641,7 +709,7 @@
641
709
  padding: calc(var(--spacing) * 3) calc(var(--spacing) * 4);
642
710
  margin: calc(var(--spacing) * 3) 0;
643
711
  overflow-x: auto;
644
- font-family: ui-monospace, "SFMono-Regular", "Menlo", monospace;
712
+ font-family: var(--lt-font-mono);
645
713
  font-size: var(--text-lg);
646
714
  }
647
715
 
@@ -2,6 +2,7 @@ import { useT } from "../../i18n/instance.js";
2
2
  import { cn } from "../../lib/utils.js";
3
3
  import { Icon } from "../../icons/sprite.js";
4
4
  import { RenderNode } from "../../core/renderer.js";
5
+ import { resolveText } from "../../i18n/translatable.js";
5
6
  import { onCallout } from "../../toast/callout.js";
6
7
  import { variantStyles } from "../../toast/variant-styles.js";
7
8
  import { useEffect, useState } from "react";
@@ -34,11 +35,11 @@ var Callouts = () => {
34
35
  children: [
35
36
  callout.title ? /* @__PURE__ */ jsx("p", {
36
37
  className: "text-sm font-medium text-lt-fg",
37
- children: callout.title
38
+ children: resolveText(callout.title, t)
38
39
  }) : null,
39
40
  /* @__PURE__ */ jsx("p", {
40
41
  className: "text-sm text-lt-fg",
41
- children: callout.message
42
+ children: resolveText(callout.message, t)
42
43
  }),
43
44
  callout.action ? /* @__PURE__ */ jsx("div", {
44
45
  className: "flex flex-wrap gap-2",
@@ -1 +1 @@
1
- {"version":3,"file":"callouts.js","names":[],"sources":["../../../resources/js/layout/components/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\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { variantStyles } from \"@lattice-php/lattice/toast\";\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(\"common.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,kBAAkB,SAAS;KACzC,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"}
1
+ {"version":3,"file":"callouts.js","names":[],"sources":["../../../resources/js/layout/components/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\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { resolveText } from \"@lattice-php/lattice/i18n/translatable\";\nimport { variantStyles } from \"@lattice-php/lattice/toast\";\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\">{resolveText(callout.title, t)}</p>\n ) : null}\n <p className=\"text-sm text-lt-fg\">{resolveText(callout.message, t)}</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(\"common.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":";;;;;;;;;;AAaA,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,YAAY,QAAQ,OAAO,CAAC;MAAK,CAAA,IAC9E;MACJ,oBAAC,KAAD;OAAG,WAAU;iBAAsB,YAAY,QAAQ,SAAS,CAAC;MAAK,CAAA;MACrE,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,kBAAkB,SAAS;KACzC,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"}
@@ -2,23 +2,28 @@ import { useT } from "../../i18n/instance.js";
2
2
  import { cn } from "../../lib/utils.js";
3
3
  import { IconRenderer } from "../../icons/icon-renderer.js";
4
4
  import { RenderNode } from "../../core/renderer.js";
5
+ import { resolveText } from "../../i18n/translatable.js";
5
6
  import { Link } from "@inertiajs/react";
6
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
8
  //#region resources/js/notifications/components/notification-item.tsx
8
9
  var variantIconClass = {
10
+ primary: "text-lt-primary",
11
+ secondary: "text-lt-muted-fg",
9
12
  success: "text-lt-success",
10
13
  info: "text-lt-info",
11
14
  warning: "text-lt-warning",
12
- error: "text-lt-danger"
15
+ danger: "text-lt-danger"
13
16
  };
14
17
  function NotificationItemRow({ notification, onMarkRead, onDismiss }) {
15
18
  const { t } = useT("lattice");
16
- const content = /* @__PURE__ */ jsxs(Fragment, { children: [notification.title ? /* @__PURE__ */ jsx("p", {
19
+ const title = resolveText(notification.title, t);
20
+ const body = resolveText(notification.body, t);
21
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [title ? /* @__PURE__ */ jsx("p", {
17
22
  className: "truncate text-sm font-medium text-lt-fg",
18
- children: notification.title
19
- }) : null, notification.body ? /* @__PURE__ */ jsx("p", {
23
+ children: title
24
+ }) : null, body ? /* @__PURE__ */ jsx("p", {
20
25
  className: "text-sm text-lt-muted-fg",
21
- children: notification.body
26
+ children: body
22
27
  }) : null] });
23
28
  return /* @__PURE__ */ jsxs("li", {
24
29
  className: cn("flex gap-3 px-3 py-3", !notification.isRead && "bg-lt-muted/40"),
@@ -1 +1 @@
1
- {"version":3,"file":"notification-item.js","names":[],"sources":["../../../resources/js/notifications/components/notification-item.tsx"],"sourcesContent":["import { Link } from \"@inertiajs/react\";\nimport { RenderNode } from \"@lattice-php/lattice/core/renderer\";\nimport { IconRenderer } from \"@lattice-php/lattice/icons\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport type { NotificationItem } from \"@lattice-php/lattice/notifications/types\";\n\nconst variantIconClass: Record<NonNullable<NotificationItem[\"variant\"]>, string> = {\n success: \"text-lt-success\",\n info: \"text-lt-info\",\n warning: \"text-lt-warning\",\n error: \"text-lt-danger\",\n};\n\nexport function NotificationItemRow({\n notification,\n onMarkRead,\n onDismiss,\n}: {\n notification: NotificationItem;\n onMarkRead: (id: string) => void;\n onDismiss: (id: string) => void;\n}) {\n const { t } = useT(\"lattice\");\n\n const content = (\n <>\n {notification.title ? (\n <p className=\"truncate text-sm font-medium text-lt-fg\">{notification.title}</p>\n ) : null}\n {notification.body ? <p className=\"text-sm text-lt-muted-fg\">{notification.body}</p> : null}\n </>\n );\n\n return (\n <li\n className={cn(\"flex gap-3 px-3 py-3\", !notification.isRead && \"bg-lt-muted/40\")}\n data-test=\"notification\"\n >\n {notification.icon ? (\n <IconRenderer\n icon={notification.icon}\n className={cn(\n \"mt-0.5 size-lt-icon-md\",\n notification.variant ? variantIconClass[notification.variant] : undefined,\n )}\n />\n ) : null}\n <div className=\"min-w-0 flex-1\">\n {notification.href ? (\n <Link\n href={notification.href}\n className=\"block\"\n data-test=\"notification-link\"\n onClick={() => onMarkRead(notification.id)}\n >\n {content}\n </Link>\n ) : (\n content\n )}\n {notification.actions.length > 0 ? (\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {notification.actions.map((node, index) => (\n <RenderNode key={node.key ?? node.id ?? `action-${index}`} node={node} />\n ))}\n </div>\n ) : null}\n </div>\n <div className=\"flex shrink-0 flex-col gap-1\">\n {!notification.isRead ? (\n <button\n type=\"button\"\n className=\"text-xs text-lt-muted-fg hover:text-lt-fg\"\n onClick={() => onMarkRead(notification.id)}\n >\n {t(\"notifications.mark-read\", \"Mark read\")}\n </button>\n ) : null}\n <button\n type=\"button\"\n aria-label={t(\"notifications.dismiss\", \"Dismiss\")}\n className=\"text-xs text-lt-muted-fg hover:text-lt-fg\"\n onClick={() => onDismiss(notification.id)}\n >\n {t(\"notifications.dismiss\", \"Dismiss\")}\n </button>\n </div>\n </li>\n );\n}\n"],"mappings":";;;;;;;AAOA,IAAM,mBAA6E;CACjF,SAAS;CACT,MAAM;CACN,SAAS;CACT,OAAO;AACT;AAEA,SAAgB,oBAAoB,EAClC,cACA,YACA,aAKC;CACD,MAAM,EAAE,MAAM,KAAK,SAAS;CAE5B,MAAM,UACJ,qBAAA,UAAA,EAAA,UAAA,CACG,aAAa,QACZ,oBAAC,KAAD;EAAG,WAAU;YAA2C,aAAa;CAAS,CAAA,IAC5E,MACH,aAAa,OAAO,oBAAC,KAAD;EAAG,WAAU;YAA4B,aAAa;CAAQ,CAAA,IAAI,IACvF,EAAA,CAAA;CAGJ,OACE,qBAAC,MAAD;EACE,WAAW,GAAG,wBAAwB,CAAC,aAAa,UAAU,gBAAgB;EAC9E,aAAU;YAFZ;GAIG,aAAa,OACZ,oBAAC,cAAD;IACE,MAAM,aAAa;IACnB,WAAW,GACT,0BACA,aAAa,UAAU,iBAAiB,aAAa,WAAW,KAAA,CAClE;GACD,CAAA,IACC;GACJ,qBAAC,OAAD;IAAK,WAAU;cAAf,CACG,aAAa,OACZ,oBAAC,MAAD;KACE,MAAM,aAAa;KACnB,WAAU;KACV,aAAU;KACV,eAAe,WAAW,aAAa,EAAE;eAExC;IACG,CAAA,IAEN,SAED,aAAa,QAAQ,SAAS,IAC7B,oBAAC,OAAD;KAAK,WAAU;eACZ,aAAa,QAAQ,KAAK,MAAM,UAC/B,oBAAC,YAAD,EAAiE,KAAO,GAAvD,KAAK,OAAO,KAAK,MAAM,UAAU,OAAsB,CACzE;IACE,CAAA,IACH,IACD;;GACL,qBAAC,OAAD;IAAK,WAAU;cAAf,CACG,CAAC,aAAa,SACb,oBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,eAAe,WAAW,aAAa,EAAE;eAExC,EAAE,2BAA2B,WAAW;IACnC,CAAA,IACN,MACJ,oBAAC,UAAD;KACE,MAAK;KACL,cAAY,EAAE,yBAAyB,SAAS;KAChD,WAAU;KACV,eAAe,UAAU,aAAa,EAAE;eAEvC,EAAE,yBAAyB,SAAS;IAC/B,CAAA,CACL;;EACH;;AAER"}
1
+ {"version":3,"file":"notification-item.js","names":[],"sources":["../../../resources/js/notifications/components/notification-item.tsx"],"sourcesContent":["import { Link } from \"@inertiajs/react\";\nimport { RenderNode } from \"@lattice-php/lattice/core/renderer\";\nimport { IconRenderer } from \"@lattice-php/lattice/icons\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { resolveText } from \"@lattice-php/lattice/i18n/translatable\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport type { NotificationItem } from \"@lattice-php/lattice/notifications/types\";\n\nconst variantIconClass: Record<NonNullable<NotificationItem[\"variant\"]>, string> = {\n primary: \"text-lt-primary\",\n secondary: \"text-lt-muted-fg\",\n success: \"text-lt-success\",\n info: \"text-lt-info\",\n warning: \"text-lt-warning\",\n danger: \"text-lt-danger\",\n};\n\nexport function NotificationItemRow({\n notification,\n onMarkRead,\n onDismiss,\n}: {\n notification: NotificationItem;\n onMarkRead: (id: string) => void;\n onDismiss: (id: string) => void;\n}) {\n const { t } = useT(\"lattice\");\n\n const title = resolveText(notification.title, t);\n const body = resolveText(notification.body, t);\n\n const content = (\n <>\n {title ? <p className=\"truncate text-sm font-medium text-lt-fg\">{title}</p> : null}\n {body ? <p className=\"text-sm text-lt-muted-fg\">{body}</p> : null}\n </>\n );\n\n return (\n <li\n className={cn(\"flex gap-3 px-3 py-3\", !notification.isRead && \"bg-lt-muted/40\")}\n data-test=\"notification\"\n >\n {notification.icon ? (\n <IconRenderer\n icon={notification.icon}\n className={cn(\n \"mt-0.5 size-lt-icon-md\",\n notification.variant ? variantIconClass[notification.variant] : undefined,\n )}\n />\n ) : null}\n <div className=\"min-w-0 flex-1\">\n {notification.href ? (\n <Link\n href={notification.href}\n className=\"block\"\n data-test=\"notification-link\"\n onClick={() => onMarkRead(notification.id)}\n >\n {content}\n </Link>\n ) : (\n content\n )}\n {notification.actions.length > 0 ? (\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {notification.actions.map((node, index) => (\n <RenderNode key={node.key ?? node.id ?? `action-${index}`} node={node} />\n ))}\n </div>\n ) : null}\n </div>\n <div className=\"flex shrink-0 flex-col gap-1\">\n {!notification.isRead ? (\n <button\n type=\"button\"\n className=\"text-xs text-lt-muted-fg hover:text-lt-fg\"\n onClick={() => onMarkRead(notification.id)}\n >\n {t(\"notifications.mark-read\", \"Mark read\")}\n </button>\n ) : null}\n <button\n type=\"button\"\n aria-label={t(\"notifications.dismiss\", \"Dismiss\")}\n className=\"text-xs text-lt-muted-fg hover:text-lt-fg\"\n onClick={() => onDismiss(notification.id)}\n >\n {t(\"notifications.dismiss\", \"Dismiss\")}\n </button>\n </div>\n </li>\n );\n}\n"],"mappings":";;;;;;;;AAQA,IAAM,mBAA6E;CACjF,SAAS;CACT,WAAW;CACX,SAAS;CACT,MAAM;CACN,SAAS;CACT,QAAQ;AACV;AAEA,SAAgB,oBAAoB,EAClC,cACA,YACA,aAKC;CACD,MAAM,EAAE,MAAM,KAAK,SAAS;CAE5B,MAAM,QAAQ,YAAY,aAAa,OAAO,CAAC;CAC/C,MAAM,OAAO,YAAY,aAAa,MAAM,CAAC;CAE7C,MAAM,UACJ,qBAAA,UAAA,EAAA,UAAA,CACG,QAAQ,oBAAC,KAAD;EAAG,WAAU;YAA2C;CAAS,CAAA,IAAI,MAC7E,OAAO,oBAAC,KAAD;EAAG,WAAU;YAA4B;CAAQ,CAAA,IAAI,IAC7D,EAAA,CAAA;CAGJ,OACE,qBAAC,MAAD;EACE,WAAW,GAAG,wBAAwB,CAAC,aAAa,UAAU,gBAAgB;EAC9E,aAAU;YAFZ;GAIG,aAAa,OACZ,oBAAC,cAAD;IACE,MAAM,aAAa;IACnB,WAAW,GACT,0BACA,aAAa,UAAU,iBAAiB,aAAa,WAAW,KAAA,CAClE;GACD,CAAA,IACC;GACJ,qBAAC,OAAD;IAAK,WAAU;cAAf,CACG,aAAa,OACZ,oBAAC,MAAD;KACE,MAAM,aAAa;KACnB,WAAU;KACV,aAAU;KACV,eAAe,WAAW,aAAa,EAAE;eAExC;IACG,CAAA,IAEN,SAED,aAAa,QAAQ,SAAS,IAC7B,oBAAC,OAAD;KAAK,WAAU;eACZ,aAAa,QAAQ,KAAK,MAAM,UAC/B,oBAAC,YAAD,EAAiE,KAAO,GAAvD,KAAK,OAAO,KAAK,MAAM,UAAU,OAAsB,CACzE;IACE,CAAA,IACH,IACD;;GACL,qBAAC,OAAD;IAAK,WAAU;cAAf,CACG,CAAC,aAAa,SACb,oBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,eAAe,WAAW,aAAa,EAAE;eAExC,EAAE,2BAA2B,WAAW;IACnC,CAAA,IACN,MACJ,oBAAC,UAAD;KACE,MAAK;KACL,cAAY,EAAE,yBAAyB,SAAS;KAChD,WAAU;KACV,eAAe,UAAU,aAAa,EAAE;eAEvC,EAAE,yBAAyB,SAAS;IAC/B,CAAA,CACL;;EACH;;AAER"}
@@ -2,7 +2,6 @@ import { useT } from "../../i18n/instance.js";
2
2
  import { Icon } from "../../icons/sprite.js";
3
3
  import { Popover, PopoverContent, PopoverTrigger } from "../../ui/popover.js";
4
4
  import { Dialog, DialogContent, DialogTitle } from "../../ui/dialog.js";
5
- import { Badge } from "../../ui/badge.js";
6
5
  import { useNotifications } from "../store.js";
7
6
  import { NotificationList } from "./notification-list.js";
8
7
  import { Component, Suspense, lazy } from "react";
@@ -33,10 +32,9 @@ var NotificationsComponent = ({ node }) => {
33
32
  children: [/* @__PURE__ */ jsx(Icon, {
34
33
  name: "bell",
35
34
  className: "size-lt-icon-md"
36
- }), store.unreadCount > 0 ? /* @__PURE__ */ jsx(Badge, {
37
- variant: "destructive",
35
+ }), store.unreadCount > 0 ? /* @__PURE__ */ jsx("span", {
38
36
  "data-test": "notifications-badge",
39
- className: "absolute -right-0.5 -top-0.5 min-w-4 px-1 py-0 text-[10px]",
37
+ className: "absolute -right-0.5 -top-0.5 inline-flex min-w-4 items-center justify-center rounded-lt-full bg-lt-danger px-1 py-0 text-[10px] font-medium text-lt-danger-fg",
40
38
  children: store.unreadCount
41
39
  }) : null]
42
40
  });
@@ -1 +1 @@
1
- {"version":3,"file":"notifications.js","names":[],"sources":["../../../resources/js/notifications/components/notifications.tsx"],"sourcesContent":["import { Component, lazy, Suspense, type ReactNode } from \"react\";\nimport { Badge } from \"@lattice-php/lattice/ui/badge\";\nimport { Dialog, DialogContent, DialogTitle } from \"@lattice-php/lattice/ui/dialog\";\nimport {\n Popover as PopoverRoot,\n PopoverContent,\n PopoverTrigger,\n} from \"@lattice-php/lattice/ui/popover\";\nimport { Icon } from \"@lattice-php/lattice/icons\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { useNotifications } from \"@lattice-php/lattice/notifications/store\";\nimport type { NotificationItem } from \"@lattice-php/lattice/notifications/types\";\nimport { NotificationList } from \"./notification-list\";\n\nconst NotificationsEcho = lazy(() =>\n import(\"./notifications-echo\").then((m) => ({ default: m.NotificationsEcho })),\n);\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] The notifications bell declares a realtime channel 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\nconst NotificationsComponent: RendererComponent<\"notifications\"> = ({ node }) => {\n const { t } = useT(\"lattice\");\n const store = useNotifications({\n endpoint: node.props.endpoint,\n pollingInterval: node.props.pollingInterval,\n });\n\n const label = t(\"notifications.label\", \"Notifications\");\n\n const trigger = (\n <span className=\"relative inline-flex items-center justify-center rounded-lt-sm p-2 hover:bg-lt-muted\">\n <Icon name=\"bell\" className=\"size-lt-icon-md\" />\n {store.unreadCount > 0 ? (\n <Badge\n variant=\"destructive\"\n data-test=\"notifications-badge\"\n className=\"absolute -right-0.5 -top-0.5 min-w-4 px-1 py-0 text-[10px]\"\n >\n {store.unreadCount}\n </Badge>\n ) : null}\n </span>\n );\n\n const panel = (\n <div className=\"w-80\" data-test=\"notifications-panel\">\n <div className=\"flex items-center justify-between border-b border-lt-border px-3 py-2\">\n <span className=\"text-sm font-medium\">{t(\"notifications.heading\", \"Notifications\")}</span>\n {store.unreadCount > 0 ? (\n <button\n type=\"button\"\n className=\"text-xs text-lt-muted-fg hover:text-lt-fg\"\n onClick={store.markAllRead}\n >\n {t(\"notifications.mark-all-read\", \"Mark all read\")}\n </button>\n ) : null}\n </div>\n <NotificationList\n notifications={store.notifications}\n status={store.status}\n hasMore={store.hasMore}\n onMarkRead={store.markRead}\n onDismiss={store.dismiss}\n onLoadMore={store.loadMore}\n />\n </div>\n );\n\n return (\n <>\n {node.props.channel ? (\n <EchoBoundary>\n <Suspense fallback={null}>\n <NotificationsEcho\n channel={node.props.channel}\n onReceive={(item: NotificationItem) => store.receive(item)}\n />\n </Suspense>\n </EchoBoundary>\n ) : null}\n\n {node.props.slideOut ? (\n <>\n <button\n type=\"button\"\n aria-label={label}\n data-test=\"notifications-trigger\"\n onClick={() => store.setOpen(true)}\n >\n {trigger}\n </button>\n <Dialog open={store.open} onOpenChange={store.setOpen}>\n <DialogContent aria-describedby={undefined} className=\"p-0\" placement=\"end\" width=\"sm\">\n <DialogTitle className=\"sr-only\">{label}</DialogTitle>\n {panel}\n </DialogContent>\n </Dialog>\n </>\n ) : (\n <PopoverRoot open={store.open} onOpenChange={store.setOpen}>\n <PopoverTrigger asChild>\n <button type=\"button\" aria-label={label} data-test=\"notifications-trigger\">\n {trigger}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"p-0\">\n {panel}\n </PopoverContent>\n </PopoverRoot>\n )}\n </>\n );\n};\n\nexport default NotificationsComponent;\n"],"mappings":";;;;;;;;;;AAeA,IAAM,oBAAoB,WACxB,OAAO,2BAAwB,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAC/E;AAEA,IAAM,eAAN,cAA2B,UAAwD;CACjF,QAAQ,EAAE,QAAQ,MAAM;CAExB,OAAO,2BAAgD;EACrD,OAAO,EAAE,QAAQ,KAAK;CACxB;CAEA,oBAA0B;EACxB,QAAQ,KACN,6IACF;CACF;CAEA,SAAoB;EAClB,OAAO,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM;CAC/C;AACF;AAEA,IAAM,0BAA8D,EAAE,WAAW;CAC/E,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,QAAQ,iBAAiB;EAC7B,UAAU,KAAK,MAAM;EACrB,iBAAiB,KAAK,MAAM;CAC9B,CAAC;CAED,MAAM,QAAQ,EAAE,uBAAuB,eAAe;CAEtD,MAAM,UACJ,qBAAC,QAAD;EAAM,WAAU;YAAhB,CACE,oBAAC,MAAD;GAAM,MAAK;GAAO,WAAU;EAAmB,CAAA,GAC9C,MAAM,cAAc,IACnB,oBAAC,OAAD;GACE,SAAQ;GACR,aAAU;GACV,WAAU;aAET,MAAM;EACF,CAAA,IACL,IACA;;CAGR,MAAM,QACJ,qBAAC,OAAD;EAAK,WAAU;EAAO,aAAU;YAAhC,CACE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,QAAD;IAAM,WAAU;cAAuB,EAAE,yBAAyB,eAAe;GAAQ,CAAA,GACxF,MAAM,cAAc,IACnB,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,SAAS,MAAM;cAEd,EAAE,+BAA+B,eAAe;GAC3C,CAAA,IACN,IACD;MACL,oBAAC,kBAAD;GACE,eAAe,MAAM;GACrB,QAAQ,MAAM;GACd,SAAS,MAAM;GACf,YAAY,MAAM;GAClB,WAAW,MAAM;GACjB,YAAY,MAAM;EACnB,CAAA,CACE;;CAGP,OACE,qBAAA,YAAA,EAAA,UAAA,CACG,KAAK,MAAM,UACV,oBAAC,cAAD,EAAA,UACE,oBAAC,UAAD;EAAU,UAAU;YAClB,oBAAC,mBAAD;GACE,SAAS,KAAK,MAAM;GACpB,YAAY,SAA2B,MAAM,QAAQ,IAAI;EAC1D,CAAA;CACO,CAAA,EACE,CAAA,IACZ,MAEH,KAAK,MAAM,WACV,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,UAAD;EACE,MAAK;EACL,cAAY;EACZ,aAAU;EACV,eAAe,MAAM,QAAQ,IAAI;YAEhC;CACK,CAAA,GACR,oBAAC,QAAD;EAAQ,MAAM,MAAM;EAAM,cAAc,MAAM;YAC5C,qBAAC,eAAD;GAAe,oBAAkB,KAAA;GAAW,WAAU;GAAM,WAAU;GAAM,OAAM;aAAlF,CACE,oBAAC,aAAD;IAAa,WAAU;cAAW;GAAmB,CAAA,GACpD,KACY;;CACT,CAAA,CACR,EAAA,CAAA,IAEF,qBAAC,SAAD;EAAa,MAAM,MAAM;EAAM,cAAc,MAAM;YAAnD,CACE,oBAAC,gBAAD;GAAgB,SAAA;aACd,oBAAC,UAAD;IAAQ,MAAK;IAAS,cAAY;IAAO,aAAU;cAChD;GACK,CAAA;EACM,CAAA,GAChB,oBAAC,gBAAD;GAAgB,OAAM;GAAM,WAAU;aACnC;EACa,CAAA,CACL;GAEf,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"notifications.js","names":[],"sources":["../../../resources/js/notifications/components/notifications.tsx"],"sourcesContent":["import { Component, lazy, Suspense, type ReactNode } from \"react\";\nimport { Dialog, DialogContent, DialogTitle } from \"@lattice-php/lattice/ui/dialog\";\nimport {\n Popover as PopoverRoot,\n PopoverContent,\n PopoverTrigger,\n} from \"@lattice-php/lattice/ui/popover\";\nimport { Icon } from \"@lattice-php/lattice/icons\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { useNotifications } from \"@lattice-php/lattice/notifications/store\";\nimport type { NotificationItem } from \"@lattice-php/lattice/notifications/types\";\nimport { NotificationList } from \"./notification-list\";\n\nconst NotificationsEcho = lazy(() =>\n import(\"./notifications-echo\").then((m) => ({ default: m.NotificationsEcho })),\n);\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] The notifications bell declares a realtime channel 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\nconst NotificationsComponent: RendererComponent<\"notifications\"> = ({ node }) => {\n const { t } = useT(\"lattice\");\n const store = useNotifications({\n endpoint: node.props.endpoint,\n pollingInterval: node.props.pollingInterval,\n });\n\n const label = t(\"notifications.label\", \"Notifications\");\n\n const trigger = (\n <span className=\"relative inline-flex items-center justify-center rounded-lt-sm p-2 hover:bg-lt-muted\">\n <Icon name=\"bell\" className=\"size-lt-icon-md\" />\n {store.unreadCount > 0 ? (\n <span\n data-test=\"notifications-badge\"\n className=\"absolute -right-0.5 -top-0.5 inline-flex min-w-4 items-center justify-center rounded-lt-full bg-lt-danger px-1 py-0 text-[10px] font-medium text-lt-danger-fg\"\n >\n {store.unreadCount}\n </span>\n ) : null}\n </span>\n );\n\n const panel = (\n <div className=\"w-80\" data-test=\"notifications-panel\">\n <div className=\"flex items-center justify-between border-b border-lt-border px-3 py-2\">\n <span className=\"text-sm font-medium\">{t(\"notifications.heading\", \"Notifications\")}</span>\n {store.unreadCount > 0 ? (\n <button\n type=\"button\"\n className=\"text-xs text-lt-muted-fg hover:text-lt-fg\"\n onClick={store.markAllRead}\n >\n {t(\"notifications.mark-all-read\", \"Mark all read\")}\n </button>\n ) : null}\n </div>\n <NotificationList\n notifications={store.notifications}\n status={store.status}\n hasMore={store.hasMore}\n onMarkRead={store.markRead}\n onDismiss={store.dismiss}\n onLoadMore={store.loadMore}\n />\n </div>\n );\n\n return (\n <>\n {node.props.channel ? (\n <EchoBoundary>\n <Suspense fallback={null}>\n <NotificationsEcho\n channel={node.props.channel}\n onReceive={(item: NotificationItem) => store.receive(item)}\n />\n </Suspense>\n </EchoBoundary>\n ) : null}\n\n {node.props.slideOut ? (\n <>\n <button\n type=\"button\"\n aria-label={label}\n data-test=\"notifications-trigger\"\n onClick={() => store.setOpen(true)}\n >\n {trigger}\n </button>\n <Dialog open={store.open} onOpenChange={store.setOpen}>\n <DialogContent aria-describedby={undefined} className=\"p-0\" placement=\"end\" width=\"sm\">\n <DialogTitle className=\"sr-only\">{label}</DialogTitle>\n {panel}\n </DialogContent>\n </Dialog>\n </>\n ) : (\n <PopoverRoot open={store.open} onOpenChange={store.setOpen}>\n <PopoverTrigger asChild>\n <button type=\"button\" aria-label={label} data-test=\"notifications-trigger\">\n {trigger}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"p-0\">\n {panel}\n </PopoverContent>\n </PopoverRoot>\n )}\n </>\n );\n};\n\nexport default NotificationsComponent;\n"],"mappings":";;;;;;;;;AAcA,IAAM,oBAAoB,WACxB,OAAO,2BAAwB,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAC/E;AAEA,IAAM,eAAN,cAA2B,UAAwD;CACjF,QAAQ,EAAE,QAAQ,MAAM;CAExB,OAAO,2BAAgD;EACrD,OAAO,EAAE,QAAQ,KAAK;CACxB;CAEA,oBAA0B;EACxB,QAAQ,KACN,6IACF;CACF;CAEA,SAAoB;EAClB,OAAO,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM;CAC/C;AACF;AAEA,IAAM,0BAA8D,EAAE,WAAW;CAC/E,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,QAAQ,iBAAiB;EAC7B,UAAU,KAAK,MAAM;EACrB,iBAAiB,KAAK,MAAM;CAC9B,CAAC;CAED,MAAM,QAAQ,EAAE,uBAAuB,eAAe;CAEtD,MAAM,UACJ,qBAAC,QAAD;EAAM,WAAU;YAAhB,CACE,oBAAC,MAAD;GAAM,MAAK;GAAO,WAAU;EAAmB,CAAA,GAC9C,MAAM,cAAc,IACnB,oBAAC,QAAD;GACE,aAAU;GACV,WAAU;aAET,MAAM;EACH,CAAA,IACJ,IACA;;CAGR,MAAM,QACJ,qBAAC,OAAD;EAAK,WAAU;EAAO,aAAU;YAAhC,CACE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,QAAD;IAAM,WAAU;cAAuB,EAAE,yBAAyB,eAAe;GAAQ,CAAA,GACxF,MAAM,cAAc,IACnB,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,SAAS,MAAM;cAEd,EAAE,+BAA+B,eAAe;GAC3C,CAAA,IACN,IACD;MACL,oBAAC,kBAAD;GACE,eAAe,MAAM;GACrB,QAAQ,MAAM;GACd,SAAS,MAAM;GACf,YAAY,MAAM;GAClB,WAAW,MAAM;GACjB,YAAY,MAAM;EACnB,CAAA,CACE;;CAGP,OACE,qBAAA,YAAA,EAAA,UAAA,CACG,KAAK,MAAM,UACV,oBAAC,cAAD,EAAA,UACE,oBAAC,UAAD;EAAU,UAAU;YAClB,oBAAC,mBAAD;GACE,SAAS,KAAK,MAAM;GACpB,YAAY,SAA2B,MAAM,QAAQ,IAAI;EAC1D,CAAA;CACO,CAAA,EACE,CAAA,IACZ,MAEH,KAAK,MAAM,WACV,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,UAAD;EACE,MAAK;EACL,cAAY;EACZ,aAAU;EACV,eAAe,MAAM,QAAQ,IAAI;YAEhC;CACK,CAAA,GACR,oBAAC,QAAD;EAAQ,MAAM,MAAM;EAAM,cAAc,MAAM;YAC5C,qBAAC,eAAD;GAAe,oBAAkB,KAAA;GAAW,WAAU;GAAM,WAAU;GAAM,OAAM;aAAlF,CACE,oBAAC,aAAD;IAAa,WAAU;cAAW;GAAmB,CAAA,GACpD,KACY;;CACT,CAAA,CACR,EAAA,CAAA,IAEF,qBAAC,SAAD;EAAa,MAAM,MAAM;EAAM,cAAc,MAAM;YAAnD,CACE,oBAAC,gBAAD;GAAgB,SAAA;aACd,oBAAC,UAAD;IAAQ,MAAK;IAAS,cAAY;IAAO,aAAU;cAChD;GACK,CAAA;EACM,CAAA,GAChB,oBAAC,gBAAD;GAAgB,OAAM;GAAM,WAAU;aACnC;EACa,CAAA,CACL;GAEf,EAAA,CAAA;AAEN"}
@@ -66,6 +66,7 @@ function BulkBar({ actions, selectedKeys, allMatching, total, query, canSelectAl
66
66
  type: "button",
67
67
  "data-test": prefixedTestId("bulk-action", action.id),
68
68
  variant: action.variant,
69
+ emphasis: action.emphasis,
69
70
  disabled: processing,
70
71
  onClick: () => run(action),
71
72
  children: [processing && /* @__PURE__ */ jsx(Spinner, {}), action.label]
@@ -77,6 +78,7 @@ function BulkBar({ actions, selectedKeys, allMatching, total, query, canSelectAl
77
78
  confirmLabel: confirming.confirmation.confirmLabel ?? confirming.label,
78
79
  cancelLabel: confirming.confirmation.cancelLabel ?? t("common.cancel", "Cancel"),
79
80
  confirmVariant: confirming.variant,
81
+ confirmEmphasis: confirming.emphasis,
80
82
  processing,
81
83
  onConfirm: () => void submit(confirming),
82
84
  onCancel: () => setConfirming(null)
@@ -1 +1 @@
1
- {"version":3,"file":"bulk-bar.js","names":[],"sources":["../../../resources/js/table/components/bulk-bar.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { ActionForm, runAction } from \"@lattice-php/lattice/action\";\nimport { apiFetch } from \"@lattice-php/lattice/core/api\";\nimport { useEffectDispatcher } from \"@lattice-php/lattice/effects/use-effect-dispatcher\";\nimport { Button } from \"@lattice-php/lattice/ui/button\";\nimport { ConfirmDialog } from \"@lattice-php/lattice/ui/confirm-dialog\";\nimport { Spinner } from \"@lattice-php/lattice/ui/spinner\";\nimport { prefixedTestId } from \"@lattice-php/lattice/core/test-id\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { BulkAction } from \"@lattice-php/lattice/table/lib/bulk\";\n\nexport function BulkBar({\n actions,\n selectedKeys,\n allMatching,\n total,\n query,\n canSelectAllMatching,\n onSelectAllMatching,\n onCompleted,\n}: {\n actions: BulkAction[];\n selectedKeys: string[];\n allMatching: boolean;\n total?: number;\n query: Record<string, unknown>;\n canSelectAllMatching: boolean;\n onSelectAllMatching: () => void;\n onCompleted: () => void;\n}) {\n const { t } = useT(\"lattice\");\n const [processing, setProcessing] = useState(false);\n const dispatch = useEffectDispatcher();\n const [confirming, setConfirming] = useState<BulkAction | null>(null);\n const [filling, setFilling] = useState<BulkAction | null>(null);\n\n const selectionPayload = (): Record<string, unknown> =>\n allMatching ? { allMatching: true, ...query } : { selected: selectedKeys };\n\n async function submit(action: BulkAction): Promise<void> {\n setProcessing(true);\n\n const ok = await runAction(\n () =>\n apiFetch(action.endpoint, {\n method: action.method,\n ref: action.ref,\n body: JSON.stringify(selectionPayload()),\n throwOnError: false,\n }),\n dispatch,\n );\n\n setProcessing(false);\n\n if (ok) {\n setConfirming(null);\n onCompleted();\n }\n }\n\n function run(action: BulkAction): void {\n if (action.form) {\n setFilling(action);\n\n return;\n }\n\n if (action.confirmation) {\n setConfirming(action);\n\n return;\n }\n\n void submit(action);\n }\n\n const count = allMatching ? (total ?? selectedKeys.length) : selectedKeys.length;\n\n return (\n <div className=\"flex flex-wrap items-center gap-3 border-b border-lt-border bg-lt-muted/50 p-4 text-sm\">\n <span className=\"font-medium\">\n {allMatching\n ? t(\"table.bulk.all-selected\", \"All {{count}} selected\", { count })\n : t(\"table.bulk.selected\", \"{{count}} selected\", { count })}\n </span>\n {canSelectAllMatching && (\n <button\n type=\"button\"\n data-test=\"bulk-select-all-matching\"\n className=\"font-medium text-lt-primary underline underline-offset-2\"\n onClick={onSelectAllMatching}\n >\n {t(\"table.bulk.select-all-matching\", \"Select all {{total}} matching\", { total })}\n </button>\n )}\n <div className=\"flex flex-wrap items-center gap-2\">\n {actions.map((action) => (\n <Button\n key={action.id}\n type=\"button\"\n data-test={prefixedTestId(\"bulk-action\", action.id)}\n variant={action.variant}\n disabled={processing}\n onClick={() => run(action)}\n >\n {processing && <Spinner />}\n {action.label}\n </Button>\n ))}\n </div>\n\n {confirming?.confirmation && (\n <ConfirmDialog\n title={confirming.confirmation.title ?? confirming.label}\n description={confirming.confirmation.description ?? undefined}\n confirmLabel={confirming.confirmation.confirmLabel ?? confirming.label}\n cancelLabel={confirming.confirmation.cancelLabel ?? t(\"common.cancel\", \"Cancel\")}\n confirmVariant={confirming.variant}\n processing={processing}\n onConfirm={() => void submit(confirming)}\n onCancel={() => setConfirming(null)}\n />\n )}\n\n {filling?.form && (\n <ActionForm\n cancelLabel={filling.confirmation?.cancelLabel ?? t(\"common.cancel\", \"Cancel\")}\n componentRef={filling.ref}\n description={filling.confirmation?.description ?? undefined}\n endpoint={filling.endpoint}\n extraData={selectionPayload()}\n formNode={filling.form}\n method={filling.method}\n onClose={() => setFilling(null)}\n onSuccess={() => {\n setFilling(null);\n onCompleted();\n }}\n placement={filling.modalSide ?? \"center\"}\n submitLabel={filling.confirmation?.confirmLabel ?? filling.label}\n title={filling.confirmation?.title ?? filling.label}\n width={filling.modalWidth ?? undefined}\n />\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAWA,SAAgB,QAAQ,EACtB,SACA,cACA,aACA,OACA,OACA,sBACA,qBACA,eAUC;CACD,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAClD,MAAM,WAAW,oBAAoB;CACrC,MAAM,CAAC,YAAY,iBAAiB,SAA4B,IAAI;CACpE,MAAM,CAAC,SAAS,cAAc,SAA4B,IAAI;CAE9D,MAAM,yBACJ,cAAc;EAAE,aAAa;EAAM,GAAG;CAAM,IAAI,EAAE,UAAU,aAAa;CAE3E,eAAe,OAAO,QAAmC;EACvD,cAAc,IAAI;EAElB,MAAM,KAAK,MAAM,gBAEb,SAAS,OAAO,UAAU;GACxB,QAAQ,OAAO;GACf,KAAK,OAAO;GACZ,MAAM,KAAK,UAAU,iBAAiB,CAAC;GACvC,cAAc;EAChB,CAAC,GACH,QACF;EAEA,cAAc,KAAK;EAEnB,IAAI,IAAI;GACN,cAAc,IAAI;GAClB,YAAY;EACd;CACF;CAEA,SAAS,IAAI,QAA0B;EACrC,IAAI,OAAO,MAAM;GACf,WAAW,MAAM;GAEjB;EACF;EAEA,IAAI,OAAO,cAAc;GACvB,cAAc,MAAM;GAEpB;EACF;EAEA,OAAY,MAAM;CACpB;CAEA,MAAM,QAAQ,cAAe,SAAS,aAAa,SAAU,aAAa;CAE1E,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,QAAD;IAAM,WAAU;cACb,cACG,EAAE,2BAA2B,0BAA0B,EAAE,MAAM,CAAC,IAChE,EAAE,uBAAuB,sBAAsB,EAAE,MAAM,CAAC;GACxD,CAAA;GACL,wBACC,oBAAC,UAAD;IACE,MAAK;IACL,aAAU;IACV,WAAU;IACV,SAAS;cAER,EAAE,kCAAkC,iCAAiC,EAAE,MAAM,CAAC;GACzE,CAAA;GAEV,oBAAC,OAAD;IAAK,WAAU;cACZ,QAAQ,KAAK,WACZ,qBAAC,QAAD;KAEE,MAAK;KACL,aAAW,eAAe,eAAe,OAAO,EAAE;KAClD,SAAS,OAAO;KAChB,UAAU;KACV,eAAe,IAAI,MAAM;eAN3B,CAQG,cAAc,oBAAC,SAAD,CAAU,CAAA,GACxB,OAAO,KACF;OATD,OAAO,EASN,CACT;GACE,CAAA;GAEJ,YAAY,gBACX,oBAAC,eAAD;IACE,OAAO,WAAW,aAAa,SAAS,WAAW;IACnD,aAAa,WAAW,aAAa,eAAe,KAAA;IACpD,cAAc,WAAW,aAAa,gBAAgB,WAAW;IACjE,aAAa,WAAW,aAAa,eAAe,EAAE,iBAAiB,QAAQ;IAC/E,gBAAgB,WAAW;IACf;IACZ,iBAAiB,KAAK,OAAO,UAAU;IACvC,gBAAgB,cAAc,IAAI;GACnC,CAAA;GAGF,SAAS,QACR,oBAAC,YAAD;IACE,aAAa,QAAQ,cAAc,eAAe,EAAE,iBAAiB,QAAQ;IAC7E,cAAc,QAAQ;IACtB,aAAa,QAAQ,cAAc,eAAe,KAAA;IAClD,UAAU,QAAQ;IAClB,WAAW,iBAAiB;IAC5B,UAAU,QAAQ;IAClB,QAAQ,QAAQ;IAChB,eAAe,WAAW,IAAI;IAC9B,iBAAiB;KACf,WAAW,IAAI;KACf,YAAY;IACd;IACA,WAAW,QAAQ,aAAa;IAChC,aAAa,QAAQ,cAAc,gBAAgB,QAAQ;IAC3D,OAAO,QAAQ,cAAc,SAAS,QAAQ;IAC9C,OAAO,QAAQ,cAAc,KAAA;GAC9B,CAAA;EAEA;;AAET"}
1
+ {"version":3,"file":"bulk-bar.js","names":[],"sources":["../../../resources/js/table/components/bulk-bar.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { ActionForm, runAction } from \"@lattice-php/lattice/action\";\nimport { apiFetch } from \"@lattice-php/lattice/core/api\";\nimport { useEffectDispatcher } from \"@lattice-php/lattice/effects/use-effect-dispatcher\";\nimport { Button } from \"@lattice-php/lattice/ui/button\";\nimport { ConfirmDialog } from \"@lattice-php/lattice/ui/confirm-dialog\";\nimport { Spinner } from \"@lattice-php/lattice/ui/spinner\";\nimport { prefixedTestId } from \"@lattice-php/lattice/core/test-id\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { BulkAction } from \"@lattice-php/lattice/table/lib/bulk\";\n\nexport function BulkBar({\n actions,\n selectedKeys,\n allMatching,\n total,\n query,\n canSelectAllMatching,\n onSelectAllMatching,\n onCompleted,\n}: {\n actions: BulkAction[];\n selectedKeys: string[];\n allMatching: boolean;\n total?: number;\n query: Record<string, unknown>;\n canSelectAllMatching: boolean;\n onSelectAllMatching: () => void;\n onCompleted: () => void;\n}) {\n const { t } = useT(\"lattice\");\n const [processing, setProcessing] = useState(false);\n const dispatch = useEffectDispatcher();\n const [confirming, setConfirming] = useState<BulkAction | null>(null);\n const [filling, setFilling] = useState<BulkAction | null>(null);\n\n const selectionPayload = (): Record<string, unknown> =>\n allMatching ? { allMatching: true, ...query } : { selected: selectedKeys };\n\n async function submit(action: BulkAction): Promise<void> {\n setProcessing(true);\n\n const ok = await runAction(\n () =>\n apiFetch(action.endpoint, {\n method: action.method,\n ref: action.ref,\n body: JSON.stringify(selectionPayload()),\n throwOnError: false,\n }),\n dispatch,\n );\n\n setProcessing(false);\n\n if (ok) {\n setConfirming(null);\n onCompleted();\n }\n }\n\n function run(action: BulkAction): void {\n if (action.form) {\n setFilling(action);\n\n return;\n }\n\n if (action.confirmation) {\n setConfirming(action);\n\n return;\n }\n\n void submit(action);\n }\n\n const count = allMatching ? (total ?? selectedKeys.length) : selectedKeys.length;\n\n return (\n <div className=\"flex flex-wrap items-center gap-3 border-b border-lt-border bg-lt-muted/50 p-4 text-sm\">\n <span className=\"font-medium\">\n {allMatching\n ? t(\"table.bulk.all-selected\", \"All {{count}} selected\", { count })\n : t(\"table.bulk.selected\", \"{{count}} selected\", { count })}\n </span>\n {canSelectAllMatching && (\n <button\n type=\"button\"\n data-test=\"bulk-select-all-matching\"\n className=\"font-medium text-lt-primary underline underline-offset-2\"\n onClick={onSelectAllMatching}\n >\n {t(\"table.bulk.select-all-matching\", \"Select all {{total}} matching\", { total })}\n </button>\n )}\n <div className=\"flex flex-wrap items-center gap-2\">\n {actions.map((action) => (\n <Button\n key={action.id}\n type=\"button\"\n data-test={prefixedTestId(\"bulk-action\", action.id)}\n variant={action.variant}\n emphasis={action.emphasis}\n disabled={processing}\n onClick={() => run(action)}\n >\n {processing && <Spinner />}\n {action.label}\n </Button>\n ))}\n </div>\n\n {confirming?.confirmation && (\n <ConfirmDialog\n title={confirming.confirmation.title ?? confirming.label}\n description={confirming.confirmation.description ?? undefined}\n confirmLabel={confirming.confirmation.confirmLabel ?? confirming.label}\n cancelLabel={confirming.confirmation.cancelLabel ?? t(\"common.cancel\", \"Cancel\")}\n confirmVariant={confirming.variant}\n confirmEmphasis={confirming.emphasis}\n processing={processing}\n onConfirm={() => void submit(confirming)}\n onCancel={() => setConfirming(null)}\n />\n )}\n\n {filling?.form && (\n <ActionForm\n cancelLabel={filling.confirmation?.cancelLabel ?? t(\"common.cancel\", \"Cancel\")}\n componentRef={filling.ref}\n description={filling.confirmation?.description ?? undefined}\n endpoint={filling.endpoint}\n extraData={selectionPayload()}\n formNode={filling.form}\n method={filling.method}\n onClose={() => setFilling(null)}\n onSuccess={() => {\n setFilling(null);\n onCompleted();\n }}\n placement={filling.modalSide ?? \"center\"}\n submitLabel={filling.confirmation?.confirmLabel ?? filling.label}\n title={filling.confirmation?.title ?? filling.label}\n width={filling.modalWidth ?? undefined}\n />\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAWA,SAAgB,QAAQ,EACtB,SACA,cACA,aACA,OACA,OACA,sBACA,qBACA,eAUC;CACD,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAClD,MAAM,WAAW,oBAAoB;CACrC,MAAM,CAAC,YAAY,iBAAiB,SAA4B,IAAI;CACpE,MAAM,CAAC,SAAS,cAAc,SAA4B,IAAI;CAE9D,MAAM,yBACJ,cAAc;EAAE,aAAa;EAAM,GAAG;CAAM,IAAI,EAAE,UAAU,aAAa;CAE3E,eAAe,OAAO,QAAmC;EACvD,cAAc,IAAI;EAElB,MAAM,KAAK,MAAM,gBAEb,SAAS,OAAO,UAAU;GACxB,QAAQ,OAAO;GACf,KAAK,OAAO;GACZ,MAAM,KAAK,UAAU,iBAAiB,CAAC;GACvC,cAAc;EAChB,CAAC,GACH,QACF;EAEA,cAAc,KAAK;EAEnB,IAAI,IAAI;GACN,cAAc,IAAI;GAClB,YAAY;EACd;CACF;CAEA,SAAS,IAAI,QAA0B;EACrC,IAAI,OAAO,MAAM;GACf,WAAW,MAAM;GAEjB;EACF;EAEA,IAAI,OAAO,cAAc;GACvB,cAAc,MAAM;GAEpB;EACF;EAEA,OAAY,MAAM;CACpB;CAEA,MAAM,QAAQ,cAAe,SAAS,aAAa,SAAU,aAAa;CAE1E,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,QAAD;IAAM,WAAU;cACb,cACG,EAAE,2BAA2B,0BAA0B,EAAE,MAAM,CAAC,IAChE,EAAE,uBAAuB,sBAAsB,EAAE,MAAM,CAAC;GACxD,CAAA;GACL,wBACC,oBAAC,UAAD;IACE,MAAK;IACL,aAAU;IACV,WAAU;IACV,SAAS;cAER,EAAE,kCAAkC,iCAAiC,EAAE,MAAM,CAAC;GACzE,CAAA;GAEV,oBAAC,OAAD;IAAK,WAAU;cACZ,QAAQ,KAAK,WACZ,qBAAC,QAAD;KAEE,MAAK;KACL,aAAW,eAAe,eAAe,OAAO,EAAE;KAClD,SAAS,OAAO;KAChB,UAAU,OAAO;KACjB,UAAU;KACV,eAAe,IAAI,MAAM;eAP3B,CASG,cAAc,oBAAC,SAAD,CAAU,CAAA,GACxB,OAAO,KACF;OAVD,OAAO,EAUN,CACT;GACE,CAAA;GAEJ,YAAY,gBACX,oBAAC,eAAD;IACE,OAAO,WAAW,aAAa,SAAS,WAAW;IACnD,aAAa,WAAW,aAAa,eAAe,KAAA;IACpD,cAAc,WAAW,aAAa,gBAAgB,WAAW;IACjE,aAAa,WAAW,aAAa,eAAe,EAAE,iBAAiB,QAAQ;IAC/E,gBAAgB,WAAW;IAC3B,iBAAiB,WAAW;IAChB;IACZ,iBAAiB,KAAK,OAAO,UAAU;IACvC,gBAAgB,cAAc,IAAI;GACnC,CAAA;GAGF,SAAS,QACR,oBAAC,YAAD;IACE,aAAa,QAAQ,cAAc,eAAe,EAAE,iBAAiB,QAAQ;IAC7E,cAAc,QAAQ;IACtB,aAAa,QAAQ,cAAc,eAAe,KAAA;IAClD,UAAU,QAAQ;IAClB,WAAW,iBAAiB;IAC5B,UAAU,QAAQ;IAClB,QAAQ,QAAQ;IAChB,eAAe,WAAW,IAAI;IAC9B,iBAAiB;KACf,WAAW,IAAI;KACf,YAAY;IACd;IACA,WAAW,QAAQ,aAAa;IAChC,aAAa,QAAQ,cAAc,gBAAgB,QAAQ;IAC3D,OAAO,QAAQ,cAAc,SAAS,QAAQ;IAC9C,OAAO,QAAQ,cAAc,KAAA;GAC9B,CAAA;EAEA;;AAET"}