@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
@@ -103,6 +103,7 @@ export type EffectOf<TType extends string> = string extends TType ? Effect : {
103
103
  };
104
104
  export type Action = {
105
105
  confirmation: Confirmation | null;
106
+ emphasis: Emphasis | null;
106
107
  endpoint: string | null;
107
108
  form: Node<"form"> | null;
108
109
  icon: string | null;
@@ -112,7 +113,7 @@ export type Action = {
112
113
  modalSide: Side | null;
113
114
  modalWidth: ModalWidth | null;
114
115
  ref: string | null;
115
- variant: ButtonVariant | null;
116
+ variant: Variant | null;
116
117
  };
117
118
  export type ActionGroup = {
118
119
  label: string | null;
@@ -135,6 +136,7 @@ export type Avatar = {
135
136
  src: string | null;
136
137
  };
137
138
  export type Badge = {
139
+ color: Color | null;
138
140
  label: string;
139
141
  };
140
142
  export type BadgeColumn = {
@@ -196,6 +198,7 @@ export type Builder = {
196
198
  };
197
199
  export type BulkAction = {
198
200
  confirmation: Confirmation | null;
201
+ emphasis: Emphasis | null;
199
202
  endpoint: string | null;
200
203
  form: Node<"form"> | null;
201
204
  icon: string | null;
@@ -205,25 +208,25 @@ export type BulkAction = {
205
208
  modalSide: Side | null;
206
209
  modalWidth: ModalWidth | null;
207
210
  ref: string | null;
208
- variant: ButtonVariant | null;
211
+ variant: Variant | null;
209
212
  };
210
213
  export type Button = {
211
214
  action: Node<"action"> | Node<"action.bulk"> | null;
212
215
  buttonType: ButtonType;
213
216
  effects: Effect[];
217
+ emphasis: Emphasis | null;
214
218
  href: string | null;
215
219
  icon: string | null;
216
220
  label: string | null;
217
221
  method: HttpMethod | null;
218
- variant: ButtonVariant | null;
222
+ variant: Variant | null;
219
223
  };
220
224
  export type ButtonType = "button" | "submit" | "reset";
221
- export type ButtonVariant = "default" | "destructive" | "ghost" | "info" | "link" | "outline" | "secondary" | "success";
222
225
  export type Callout = {
223
226
  action: Node | null;
224
227
  dismissible: boolean;
225
- message: string;
226
- title: string | null;
228
+ message: Translatable | string;
229
+ title: Translatable | string | null;
227
230
  variant: Variant;
228
231
  };
229
232
  export type Callouts = Record<string, never>;
@@ -450,6 +453,8 @@ export type ComponentPropsMap = {
450
453
  text: Text;
451
454
  tooltip: Tooltip;
452
455
  topbar: Topbar;
456
+ wizard: Wizard;
457
+ "wizard-step": WizardStep;
453
458
  };
454
459
  export type Condition = {
455
460
  readonly field: string;
@@ -600,6 +605,7 @@ export type EffectPropsMap = {
600
605
  toast: Toast;
601
606
  "toggle-sidebar": ToggleSidebar;
602
607
  };
608
+ export type Emphasis = "solid" | "outline" | "ghost" | "link";
603
609
  export type FieldConditions = {
604
610
  readonly disabled: Condition[];
605
611
  readonly readOnly: Condition[];
@@ -677,14 +683,15 @@ export type Form = {
677
683
  status: string | null;
678
684
  submitButton: boolean;
679
685
  submitButtons: Node<"button">[] | null;
686
+ submitEmphasis: Emphasis | null;
680
687
  submitJustify: Justify | null;
681
688
  submitLabel: string | null;
682
- submitVariant: ButtonVariant | null;
689
+ submitVariant: Variant | null;
683
690
  validationSummaryLabel: string;
684
691
  validationTimeout: number | null;
685
692
  };
686
- export type FormFieldNodeType = "field.builder" | "field.checkbox" | "field.choice" | "field.color-picker" | "field.date-input" | "field.date-time-input" | "field.file-upload" | "field.hidden-input" | "field.number-input" | "field.otp" | "field.password-input" | "field.repeater" | "field.rich-editor" | "field.select" | "field.text-input" | "field.textarea" | "field.time-input" | "field.toggle";
687
- export type FormNodeType = "field.builder" | "field.checkbox" | "field.choice" | "field.color-picker" | "field.date-input" | "field.date-time-input" | "field.file-upload" | "field.hidden-input" | "field.number-input" | "field.otp" | "field.password-input" | "field.repeater" | "field.rich-editor" | "field.select" | "field.text-input" | "field.textarea" | "field.time-input" | "field.toggle" | "form";
693
+ export type FormFieldNodeType = "field.builder" | "field.checkbox" | "field.choice" | "field.color-picker" | "field.date-input" | "field.date-time-input" | "field.file-upload" | "field.hidden-input" | "field.number-input" | "field.otp" | "field.password-input" | "field.repeater" | "field.rich-editor" | "field.select" | "field.text-input" | "field.textarea" | "field.time-input" | "field.toggle" | "wizard" | "wizard-step";
694
+ export type FormNodeType = "field.builder" | "field.checkbox" | "field.choice" | "field.color-picker" | "field.date-input" | "field.date-time-input" | "field.file-upload" | "field.hidden-input" | "field.number-input" | "field.otp" | "field.password-input" | "field.repeater" | "field.rich-editor" | "field.select" | "field.text-input" | "field.textarea" | "field.time-input" | "field.toggle" | "form" | "wizard" | "wizard-step";
688
695
  export type Fragment = {
689
696
  endpoint: string | null;
690
697
  lazy: boolean;
@@ -830,16 +837,16 @@ export type MoneyColumn = {
830
837
  toggleable: boolean;
831
838
  width: ColumnWidth;
832
839
  };
833
- export type NodeType = "action" | "action.bulk" | "action.group" | "avatar" | "badge" | "breadcrumbs" | "button" | "callouts" | "card" | "chart" | "chat.box" | "chat.part.text" | "chat.part.tool-call" | "collapsible" | "dropdown" | "field.builder" | "field.checkbox" | "field.choice" | "field.color-picker" | "field.date-input" | "field.date-time-input" | "field.file-upload" | "field.hidden-input" | "field.number-input" | "field.otp" | "field.password-input" | "field.repeater" | "field.rich-editor" | "field.select" | "field.text-input" | "field.textarea" | "field.time-input" | "field.toggle" | "floating-panel" | "form" | "fragment" | "grid" | "heading" | "icon" | "image" | "link" | "menu" | "menu-item" | "modal" | "notifications" | "outlet" | "progress" | "raw-block" | "remote.data-list" | "section" | "segmented-control" | "separator" | "sidebar" | "stack" | "tab" | "table" | "tabs" | "text" | "tooltip" | "topbar";
840
+ export type NodeType = "action" | "action.bulk" | "action.group" | "avatar" | "badge" | "breadcrumbs" | "button" | "callouts" | "card" | "chart" | "chat.box" | "chat.part.text" | "chat.part.tool-call" | "collapsible" | "dropdown" | "field.builder" | "field.checkbox" | "field.choice" | "field.color-picker" | "field.date-input" | "field.date-time-input" | "field.file-upload" | "field.hidden-input" | "field.number-input" | "field.otp" | "field.password-input" | "field.repeater" | "field.rich-editor" | "field.select" | "field.text-input" | "field.textarea" | "field.time-input" | "field.toggle" | "floating-panel" | "form" | "fragment" | "grid" | "heading" | "icon" | "image" | "link" | "menu" | "menu-item" | "modal" | "notifications" | "outlet" | "progress" | "raw-block" | "remote.data-list" | "section" | "segmented-control" | "separator" | "sidebar" | "stack" | "tab" | "table" | "tabs" | "text" | "tooltip" | "topbar" | "wizard" | "wizard-step";
834
841
  export type NotificationItem = {
835
842
  readonly actions: Node[];
836
- readonly body: string | null;
843
+ readonly body: Translatable | string | null;
837
844
  readonly createdAt: string | null;
838
845
  readonly href: string | null;
839
846
  readonly icon: string | null;
840
847
  readonly id: string;
841
848
  readonly isRead: boolean;
842
- readonly title: string | null;
849
+ readonly title: Translatable | string | null;
843
850
  readonly variant: Variant | null;
844
851
  };
845
852
  export type NotificationList = {
@@ -982,12 +989,12 @@ export type Placement = "top" | "bottom" | "right";
982
989
  export type Progress = {
983
990
  color: Color | null;
984
991
  max: number;
992
+ shape: ProgressShape;
985
993
  showValue: boolean;
986
994
  size: Size;
987
995
  value: number;
988
- variant: ProgressVariant;
989
996
  };
990
- export type ProgressVariant = "bar" | "circle";
997
+ export type ProgressShape = "bar" | "circle";
991
998
  export type RawBlock = {
992
999
  html: string;
993
1000
  };
@@ -1063,7 +1070,7 @@ export type RichEditor = {
1063
1070
  value: unknown;
1064
1071
  };
1065
1072
  export type RowAction = {
1066
- destructive: boolean;
1073
+ danger: boolean;
1067
1074
  icon: string | null;
1068
1075
  key: string;
1069
1076
  label: string | null;
@@ -1376,6 +1383,14 @@ export type UiNodeType = "avatar" | "badge" | "button" | "card" | "chart" | "col
1376
1383
  export type UnreadCount = {
1377
1384
  readonly unreadCount: number;
1378
1385
  };
1379
- export type Variant = "success" | "info" | "warning" | "error";
1386
+ export type Variant = "primary" | "secondary" | "success" | "info" | "warning" | "danger";
1380
1387
  export type Width = "full" | "auto" | "sm" | "md" | "lg" | "fill";
1388
+ export type Wizard = {
1389
+ orientation: Orientation;
1390
+ };
1391
+ export type WizardStep = {
1392
+ description: string | null;
1393
+ label: string;
1394
+ name: string;
1395
+ };
1381
1396
  export {};
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- export declare const actionMenuItemClassName = "flex h-lt-control-sm w-full items-center justify-start gap-2 rounded-lt-sm px-2.5 text-left text-sm font-normal text-lt-popover-fg no-underline decoration-transparent shadow-none transition-colors hover:bg-lt-accent/70 hover:text-lt-popover-fg focus-visible:bg-lt-accent/70 focus-visible:text-lt-popover-fg focus-visible:ring-0 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:size-lt-icon-sm [&_svg]:text-lt-muted-fg";
2
+ export declare const actionMenuItemClassName = "flex h-lt-control-sm w-full items-center justify-start gap-2 rounded-lt-sm px-2.5 text-left text-sm font-normal text-lt-popover-fg no-underline decoration-transparent shadow-none transition-colors hover:bg-lt-accent/70 hover:text-lt-popover-fg focus-visible:bg-lt-accent/70 focus-visible:text-lt-popover-fg focus-visible:ring-0 focus-visible:outline-none disabled:pointer-events-none disabled:text-lt-disabled-fg [&_svg]:size-lt-icon-sm [&_svg]:text-lt-muted-fg";
3
3
  export declare function ActionMenuProvider({ children }: {
4
4
  children: ReactNode;
5
5
  }): import("react").JSX.Element;
@@ -2,7 +2,7 @@ import { createContext, useContext } from "react";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  //#region resources/js/ui/action-menu-context.tsx
4
4
  var ActionMenuContext = createContext(false);
5
- var actionMenuItemClassName = "flex h-lt-control-sm w-full items-center justify-start gap-2 rounded-lt-sm px-2.5 text-left text-sm font-normal text-lt-popover-fg no-underline decoration-transparent shadow-none transition-colors hover:bg-lt-accent/70 hover:text-lt-popover-fg focus-visible:bg-lt-accent/70 focus-visible:text-lt-popover-fg focus-visible:ring-0 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:size-lt-icon-sm [&_svg]:text-lt-muted-fg";
5
+ var actionMenuItemClassName = "flex h-lt-control-sm w-full items-center justify-start gap-2 rounded-lt-sm px-2.5 text-left text-sm font-normal text-lt-popover-fg no-underline decoration-transparent shadow-none transition-colors hover:bg-lt-accent/70 hover:text-lt-popover-fg focus-visible:bg-lt-accent/70 focus-visible:text-lt-popover-fg focus-visible:ring-0 focus-visible:outline-none disabled:pointer-events-none disabled:text-lt-disabled-fg [&_svg]:size-lt-icon-sm [&_svg]:text-lt-muted-fg";
6
6
  function ActionMenuProvider({ children }) {
7
7
  return /* @__PURE__ */ jsx(ActionMenuContext.Provider, {
8
8
  value: true,
@@ -1 +1 @@
1
- {"version":3,"file":"action-menu-context.js","names":[],"sources":["../../resources/js/ui/action-menu-context.tsx"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\";\n\nconst ActionMenuContext = createContext(false);\n\nexport const actionMenuItemClassName =\n \"flex h-lt-control-sm w-full items-center justify-start gap-2 rounded-lt-sm px-2.5 text-left text-sm font-normal text-lt-popover-fg no-underline decoration-transparent shadow-none transition-colors hover:bg-lt-accent/70 hover:text-lt-popover-fg focus-visible:bg-lt-accent/70 focus-visible:text-lt-popover-fg focus-visible:ring-0 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:size-lt-icon-sm [&_svg]:text-lt-muted-fg\";\n\nexport function ActionMenuProvider({ children }: { children: ReactNode }) {\n return <ActionMenuContext.Provider value={true}>{children}</ActionMenuContext.Provider>;\n}\n\nexport function useActionMenu(): boolean {\n return useContext(ActionMenuContext);\n}\n"],"mappings":";;;AAEA,IAAM,oBAAoB,cAAc,KAAK;AAE7C,IAAa,0BACX;AAEF,SAAgB,mBAAmB,EAAE,YAAqC;CACxE,OAAO,oBAAC,kBAAkB,UAAnB;EAA4B,OAAO;EAAO;CAAqC,CAAA;AACxF;AAEA,SAAgB,gBAAyB;CACvC,OAAO,WAAW,iBAAiB;AACrC"}
1
+ {"version":3,"file":"action-menu-context.js","names":[],"sources":["../../resources/js/ui/action-menu-context.tsx"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\";\n\nconst ActionMenuContext = createContext(false);\n\nexport const actionMenuItemClassName =\n \"flex h-lt-control-sm w-full items-center justify-start gap-2 rounded-lt-sm px-2.5 text-left text-sm font-normal text-lt-popover-fg no-underline decoration-transparent shadow-none transition-colors hover:bg-lt-accent/70 hover:text-lt-popover-fg focus-visible:bg-lt-accent/70 focus-visible:text-lt-popover-fg focus-visible:ring-0 focus-visible:outline-none disabled:pointer-events-none disabled:text-lt-disabled-fg [&_svg]:size-lt-icon-sm [&_svg]:text-lt-muted-fg\";\n\nexport function ActionMenuProvider({ children }: { children: ReactNode }) {\n return <ActionMenuContext.Provider value={true}>{children}</ActionMenuContext.Provider>;\n}\n\nexport function useActionMenu(): boolean {\n return useContext(ActionMenuContext);\n}\n"],"mappings":";;;AAEA,IAAM,oBAAoB,cAAc,KAAK;AAE7C,IAAa,0BACX;AAEF,SAAgB,mBAAmB,EAAE,YAAqC;CACxE,OAAO,oBAAC,kBAAkB,UAAnB;EAA4B,OAAO;EAAO;CAAqC,CAAA;AACxF;AAEA,SAAgB,gBAAyB;CACvC,OAAO,WAAW,iBAAiB;AACrC"}
@@ -25,7 +25,7 @@ function AffixSegment({ affix, side, squared = false }) {
25
25
  function AffixGroup({ prefix, suffix, end, children }) {
26
26
  if (!prefix && !suffix && !end) return children("");
27
27
  return /* @__PURE__ */ jsxs("div", {
28
- className: "group flex w-full rounded-lt-sm transition-[color,box-shadow] has-[:focus-visible]:ring-[3px] has-[:focus-visible]:ring-lt-ring/50",
28
+ className: "group flex w-full rounded-lt-sm transition-[color,box-shadow] has-[:focus-visible]:ring-[length:var(--lt-ring-width)] has-[:focus-visible]:ring-lt-ring/50",
29
29
  "data-slot": "affix-group",
30
30
  children: [
31
31
  prefix ? /* @__PURE__ */ jsx(AffixSegment, {
@@ -1 +1 @@
1
- {"version":3,"file":"affix-group.js","names":[],"sources":["../../resources/js/ui/affix-group.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { Affix } from \"@lattice-php/lattice/types/generated\";\nimport { IconRenderer } from \"@lattice-php/lattice/icons\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\n\nfunction AffixSegment({\n affix,\n side,\n squared = false,\n}: {\n affix: Affix;\n side: \"start\" | \"end\";\n squared?: boolean;\n}) {\n return (\n <span\n data-slot={`affix-${side}`}\n className={cn(\n \"inline-flex h-lt-control-md shrink-0 items-center border border-lt-input bg-lt-muted px-3 text-base whitespace-nowrap text-lt-muted-fg\",\n \"group-has-[:focus-visible]:border-lt-ring\",\n side === \"start\" ? \"rounded-l-lt-sm border-r-0\" : \"rounded-r-lt-sm border-l-0\",\n squared && \"rounded-r-none border-r-0\",\n )}\n >\n {affix.icon ? <IconRenderer className=\"size-lt-icon-md\" icon={affix.icon} /> : affix.text}\n </span>\n );\n}\n\n/**\n * Wraps a single-line control in a prefix/suffix input group. The control is a\n * render prop receiving the class names that square the corners adjacent to an\n * affix; with no affixes the control renders untouched.\n *\n * The focus ring lives on the group, not the bare input, so it surrounds the\n * whole control — affixes included — instead of being clipped by the opaque\n * affix segments. The control itself stays the focus target; only its own ring\n * is suppressed.\n */\nexport function AffixGroup({\n prefix,\n suffix,\n end,\n children,\n}: {\n prefix?: Affix | null;\n suffix?: Affix | null;\n end?: ReactNode;\n children: (controlClassName: string) => ReactNode;\n}) {\n if (!prefix && !suffix && !end) {\n return children(\"\");\n }\n\n return (\n <div\n className=\"group flex w-full rounded-lt-sm transition-[color,box-shadow] has-[:focus-visible]:ring-[3px] has-[:focus-visible]:ring-lt-ring/50\"\n data-slot=\"affix-group\"\n >\n {prefix ? <AffixSegment affix={prefix} side=\"start\" /> : null}\n <div className=\"min-w-0 flex-1\">\n {children(\n cn(\n \"focus-visible:ring-0\",\n prefix && \"rounded-l-none\",\n (suffix || end) && \"rounded-r-none\",\n ),\n )}\n </div>\n {suffix ? <AffixSegment affix={suffix} side=\"end\" squared={Boolean(end)} /> : null}\n {end}\n </div>\n );\n}\n"],"mappings":";;;;AAKA,SAAS,aAAa,EACpB,OACA,MACA,UAAU,SAKT;CACD,OACE,oBAAC,QAAD;EACE,aAAW,SAAS;EACpB,WAAW,GACT,0IACA,6CACA,SAAS,UAAU,+BAA+B,8BAClD,WAAW,2BACb;YAEC,MAAM,OAAO,oBAAC,cAAD;GAAc,WAAU;GAAkB,MAAM,MAAM;EAAO,CAAA,IAAI,MAAM;CACjF,CAAA;AAEV;;;;;;;;;;;AAYA,SAAgB,WAAW,EACzB,QACA,QACA,KACA,YAMC;CACD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KACzB,OAAO,SAAS,EAAE;CAGpB,OACE,qBAAC,OAAD;EACE,WAAU;EACV,aAAU;YAFZ;GAIG,SAAS,oBAAC,cAAD;IAAc,OAAO;IAAQ,MAAK;GAAS,CAAA,IAAI;GACzD,oBAAC,OAAD;IAAK,WAAU;cACZ,SACC,GACE,wBACA,UAAU,mBACT,UAAU,QAAQ,gBACrB,CACF;GACG,CAAA;GACJ,SAAS,oBAAC,cAAD;IAAc,OAAO;IAAQ,MAAK;IAAM,SAAS,QAAQ,GAAG;GAAI,CAAA,IAAI;GAC7E;EACE;;AAET"}
1
+ {"version":3,"file":"affix-group.js","names":[],"sources":["../../resources/js/ui/affix-group.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { Affix } from \"@lattice-php/lattice/types/generated\";\nimport { IconRenderer } from \"@lattice-php/lattice/icons\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\n\nfunction AffixSegment({\n affix,\n side,\n squared = false,\n}: {\n affix: Affix;\n side: \"start\" | \"end\";\n squared?: boolean;\n}) {\n return (\n <span\n data-slot={`affix-${side}`}\n className={cn(\n \"inline-flex h-lt-control-md shrink-0 items-center border border-lt-input bg-lt-muted px-3 text-base whitespace-nowrap text-lt-muted-fg\",\n \"group-has-[:focus-visible]:border-lt-ring\",\n side === \"start\" ? \"rounded-l-lt-sm border-r-0\" : \"rounded-r-lt-sm border-l-0\",\n squared && \"rounded-r-none border-r-0\",\n )}\n >\n {affix.icon ? <IconRenderer className=\"size-lt-icon-md\" icon={affix.icon} /> : affix.text}\n </span>\n );\n}\n\n/**\n * Wraps a single-line control in a prefix/suffix input group. The control is a\n * render prop receiving the class names that square the corners adjacent to an\n * affix; with no affixes the control renders untouched.\n *\n * The focus ring lives on the group, not the bare input, so it surrounds the\n * whole control — affixes included — instead of being clipped by the opaque\n * affix segments. The control itself stays the focus target; only its own ring\n * is suppressed.\n */\nexport function AffixGroup({\n prefix,\n suffix,\n end,\n children,\n}: {\n prefix?: Affix | null;\n suffix?: Affix | null;\n end?: ReactNode;\n children: (controlClassName: string) => ReactNode;\n}) {\n if (!prefix && !suffix && !end) {\n return children(\"\");\n }\n\n return (\n <div\n className=\"group flex w-full rounded-lt-sm transition-[color,box-shadow] has-[:focus-visible]:ring-[length:var(--lt-ring-width)] has-[:focus-visible]:ring-lt-ring/50\"\n data-slot=\"affix-group\"\n >\n {prefix ? <AffixSegment affix={prefix} side=\"start\" /> : null}\n <div className=\"min-w-0 flex-1\">\n {children(\n cn(\n \"focus-visible:ring-0\",\n prefix && \"rounded-l-none\",\n (suffix || end) && \"rounded-r-none\",\n ),\n )}\n </div>\n {suffix ? <AffixSegment affix={suffix} side=\"end\" squared={Boolean(end)} /> : null}\n {end}\n </div>\n );\n}\n"],"mappings":";;;;AAKA,SAAS,aAAa,EACpB,OACA,MACA,UAAU,SAKT;CACD,OACE,oBAAC,QAAD;EACE,aAAW,SAAS;EACpB,WAAW,GACT,0IACA,6CACA,SAAS,UAAU,+BAA+B,8BAClD,WAAW,2BACb;YAEC,MAAM,OAAO,oBAAC,cAAD;GAAc,WAAU;GAAkB,MAAM,MAAM;EAAO,CAAA,IAAI,MAAM;CACjF,CAAA;AAEV;;;;;;;;;;;AAYA,SAAgB,WAAW,EACzB,QACA,QACA,KACA,YAMC;CACD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KACzB,OAAO,SAAS,EAAE;CAGpB,OACE,qBAAC,OAAD;EACE,WAAU;EACV,aAAU;YAFZ;GAIG,SAAS,oBAAC,cAAD;IAAc,OAAO;IAAQ,MAAK;GAAS,CAAA,IAAI;GACzD,oBAAC,OAAD;IAAK,WAAU;cACZ,SACC,GACE,wBACA,UAAU,mBACT,UAAU,QAAQ,gBACrB,CACF;GACG,CAAA;GACJ,SAAS,oBAAC,cAAD;IAAc,OAAO;IAAQ,MAAK;IAAM,SAAS,QAAQ,GAAG;GAAI,CAAA,IAAI;GAC7E;EACE;;AAET"}
@@ -1,12 +1,9 @@
1
- import { VariantProps } from 'class-variance-authority';
1
+ import { Color } from '../types/generated.js';
2
2
  import { RendererComponent } from '../core/types.js';
3
3
  import * as React from "react";
4
- declare const badgeVariants: (props?: ({
5
- variant?: "default" | "destructive" | "outline" | "secondary" | null | undefined;
6
- } & import('class-variance-authority/types').ClassProp) | undefined) => string;
7
- declare function Badge({ className, variant, asChild, ...props }: React.ComponentProps<"span"> & VariantProps<typeof badgeVariants> & {
8
- asChild?: boolean;
4
+ declare function Badge({ color, className, style, ...props }: Omit<React.ComponentProps<"span">, "color"> & {
5
+ color?: Color | string | null;
9
6
  }): React.JSX.Element;
10
7
  declare const BadgeComponent: RendererComponent<"badge">;
11
8
  export default BadgeComponent;
12
- export { Badge, badgeVariants };
9
+ export { Badge };
package/dist/ui/badge.js CHANGED
@@ -1,31 +1,25 @@
1
1
  import { cn } from "../lib/utils.js";
2
+ import { coerceColor, namedColor, toneProps } from "../lib/color.js";
2
3
  import "react";
3
4
  import { jsx } from "react/jsx-runtime";
4
- import { Slot } from "@radix-ui/react-slot";
5
- import { cva } from "class-variance-authority";
6
5
  //#region resources/js/ui/badge.tsx
7
- var badgeVariants = cva("inline-flex items-center justify-center rounded-lt-sm border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-lt-icon-xs gap-1 [&>svg]:pointer-events-none focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[3px] aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger transition-[color,box-shadow] overflow-hidden", {
8
- variants: { variant: {
9
- default: "border-transparent bg-lt-primary text-lt-primary-fg [a&]:hover:bg-lt-primary-hover",
10
- secondary: "border-transparent bg-lt-secondary text-lt-secondary-fg [a&]:hover:bg-lt-secondary-hover",
11
- destructive: "border-transparent bg-lt-danger text-lt-danger-fg [a&]:hover:bg-lt-danger-hover focus-visible:ring-lt-danger/20 dark:focus-visible:ring-lt-danger/40 dark:bg-lt-danger/60",
12
- outline: "border-lt-border text-lt-fg [a&]:hover:bg-lt-accent [a&]:hover:text-lt-accent-fg"
13
- } },
14
- defaultVariants: { variant: "default" }
15
- });
16
- function Badge({ className, variant, asChild = false, ...props }) {
17
- return /* @__PURE__ */ jsx(asChild ? Slot : "span", {
6
+ function Badge({ color, className, style, ...props }) {
7
+ const tone = toneProps(coerceColor(color ?? void 0) ?? namedColor("gray"));
8
+ return /* @__PURE__ */ jsx("span", {
18
9
  "data-slot": "badge",
19
- className: cn(badgeVariants({ variant }), className),
10
+ className: cn("lt-badge", tone.className, className),
11
+ style: {
12
+ ...tone.style,
13
+ ...style
14
+ },
20
15
  ...props
21
16
  });
22
17
  }
23
18
  var BadgeComponent = ({ node }) => /* @__PURE__ */ jsx(Badge, {
24
- variant: "secondary",
25
- className: "w-fit px-3 py-1",
19
+ color: node.props.color,
26
20
  children: node.props.label
27
21
  });
28
22
  //#endregion
29
- export { Badge, badgeVariants, BadgeComponent as default };
23
+ export { Badge, BadgeComponent as default };
30
24
 
31
25
  //# sourceMappingURL=badge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"badge.js","names":[],"sources":["../../resources/js/ui/badge.tsx"],"sourcesContent":["import { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-lt-sm border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-lt-icon-xs gap-1 [&>svg]:pointer-events-none focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[3px] aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-lt-primary text-lt-primary-fg [a&]:hover:bg-lt-primary-hover\",\n secondary:\n \"border-transparent bg-lt-secondary text-lt-secondary-fg [a&]:hover:bg-lt-secondary-hover\",\n destructive:\n \"border-transparent bg-lt-danger text-lt-danger-fg [a&]:hover:bg-lt-danger-hover focus-visible:ring-lt-danger/20 dark:focus-visible:ring-lt-danger/40 dark:bg-lt-danger/60\",\n outline: \"border-lt-border text-lt-fg [a&]:hover:bg-lt-accent [a&]:hover:text-lt-accent-fg\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> & VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"span\";\n\n return (\n <Comp data-slot=\"badge\" className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nconst BadgeComponent: RendererComponent<\"badge\"> = ({ node }) => (\n <Badge variant=\"secondary\" className=\"w-fit px-3 py-1\">\n {node.props.label}\n </Badge>\n);\n\nexport default BadgeComponent;\nexport { Badge, badgeVariants };\n"],"mappings":";;;;;;AAMA,IAAM,gBAAgB,IACpB,8ZACA;CACE,UAAU,EACR,SAAS;EACP,SACE;EACF,WACE;EACF,aACE;EACF,SAAS;CACX,EACF;CACA,iBAAiB,EACf,SAAS,UACX;AACF,CACF;AAEA,SAAS,MAAM,EACb,WACA,SACA,UAAU,OACV,GAAG,SACyF;CAG5F,OACE,oBAHW,UAAU,OAAO,QAG5B;EAAM,aAAU;EAAQ,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;EAAG,GAAI;CAAQ,CAAA;AAE9F;AAEA,IAAM,kBAA8C,EAAE,WACpD,oBAAC,OAAD;CAAO,SAAQ;CAAY,WAAU;WAClC,KAAK,MAAM;AACP,CAAA"}
1
+ {"version":3,"file":"badge.js","names":[],"sources":["../../resources/js/ui/badge.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { coerceColor, namedColor, toneProps } from \"@lattice-php/lattice/lib/color\";\nimport type { Color } from \"@lattice-php/lattice/types/generated\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\n\nfunction Badge({\n color,\n className,\n style,\n ...props\n}: Omit<React.ComponentProps<\"span\">, \"color\"> & { color?: Color | string | null }) {\n const tone = toneProps(coerceColor(color ?? undefined) ?? namedColor(\"gray\"));\n\n return (\n <span\n data-slot=\"badge\"\n className={cn(\"lt-badge\", tone.className, className)}\n style={{ ...tone.style, ...style }}\n {...props}\n />\n );\n}\n\nconst BadgeComponent: RendererComponent<\"badge\"> = ({ node }) => (\n <Badge color={node.props.color}>{node.props.label}</Badge>\n);\n\nexport default BadgeComponent;\nexport { Badge };\n"],"mappings":";;;;;AAMA,SAAS,MAAM,EACb,OACA,WACA,OACA,GAAG,SAC+E;CAClF,MAAM,OAAO,UAAU,YAAY,SAAS,KAAA,CAAS,KAAK,WAAW,MAAM,CAAC;CAE5E,OACE,oBAAC,QAAD;EACE,aAAU;EACV,WAAW,GAAG,YAAY,KAAK,WAAW,SAAS;EACnD,OAAO;GAAE,GAAG,KAAK;GAAO,GAAG;EAAM;EACjC,GAAI;CACL,CAAA;AAEL;AAEA,IAAM,kBAA8C,EAAE,WACpD,oBAAC,OAAD;CAAO,OAAO,KAAK,MAAM;WAAQ,KAAK,MAAM;AAAa,CAAA"}
@@ -1,13 +1,14 @@
1
1
  import { VariantProps } from 'class-variance-authority';
2
2
  import { RendererComponent } from '../core/types.js';
3
- import { ButtonVariant } from '../types/generated.js';
3
+ import { Emphasis, Variant } from '../types/generated.js';
4
4
  import * as React from "react";
5
- export type { ButtonVariant };
5
+ export type { Emphasis, Variant };
6
6
  declare const buttonVariants: (props?: ({
7
- variant?: "link" | "default" | "destructive" | "ghost" | "info" | "outline" | "secondary" | "success" | null | undefined;
8
- size?: "sm" | "lg" | "default" | "icon" | null | undefined;
7
+ emphasis?: "link" | "solid" | "outline" | "ghost" | null | undefined;
8
+ variant?: "primary" | "secondary" | "success" | "info" | "warning" | "danger" | null | undefined;
9
+ size?: "sm" | "md" | "lg" | "icon" | null | undefined;
9
10
  } & import('class-variance-authority/types').ClassProp) | undefined) => string;
10
- declare function Button({ className, variant, size, asChild, icon, children, ...props }: React.ComponentProps<"button"> & VariantProps<typeof buttonVariants> & {
11
+ declare function Button({ className, variant, emphasis, size, asChild, icon, children, ...props }: React.ComponentProps<"button"> & VariantProps<typeof buttonVariants> & {
11
12
  asChild?: boolean;
12
13
  /** Leading icon glyph. Ignored with `asChild` (Slot needs a single child). */
13
14
  icon?: string;
package/dist/ui/button.js CHANGED
@@ -9,31 +9,165 @@ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
9
  import { Slot } from "@radix-ui/react-slot";
10
10
  import { cva } from "class-variance-authority";
11
11
  //#region resources/js/ui/button.tsx
12
- var buttonVariants = cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lt-sm text-base font-medium transition-[color,box-shadow] disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-lt-icon-md [&_svg]:shrink-0 outline-none focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[3px] aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger", {
12
+ var buttonVariants = cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lt-sm text-base font-medium transition-[color,box-shadow] disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-lt-icon-md [&_svg]:shrink-0 outline-none focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[length:var(--lt-ring-width)] aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger", {
13
13
  variants: {
14
- variant: {
15
- default: "bg-lt-primary text-lt-primary-fg shadow-lt-xs hover:bg-lt-primary-hover active:bg-lt-primary-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none",
16
- destructive: "bg-lt-danger text-lt-danger-fg shadow-lt-xs hover:bg-lt-danger-hover active:bg-lt-danger-active focus-visible:ring-lt-danger/20 dark:focus-visible:ring-lt-danger/40 disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none",
17
- success: "bg-lt-success text-lt-success-fg shadow-lt-xs hover:bg-lt-success-hover active:bg-lt-success-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none",
18
- info: "bg-lt-info text-lt-info-fg shadow-lt-xs hover:bg-lt-info-hover active:bg-lt-info-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none",
14
+ emphasis: {
15
+ solid: "shadow-lt-xs disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none",
19
16
  outline: "border border-lt-input bg-lt-bg shadow-lt-xs hover:bg-lt-accent hover:text-lt-accent-fg disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:border-transparent disabled:shadow-none",
20
- secondary: "bg-lt-secondary text-lt-secondary-fg shadow-lt-xs hover:bg-lt-secondary-hover active:bg-lt-secondary-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none",
21
17
  ghost: "hover:bg-lt-accent hover:text-lt-accent-fg disabled:text-lt-disabled-fg",
22
- link: "text-lt-primary underline-offset-4 hover:underline disabled:text-lt-disabled-fg disabled:no-underline"
18
+ link: "underline-offset-4 hover:underline disabled:text-lt-disabled-fg disabled:no-underline"
19
+ },
20
+ variant: {
21
+ primary: "",
22
+ secondary: "",
23
+ success: "",
24
+ info: "",
25
+ warning: "",
26
+ danger: ""
23
27
  },
24
28
  size: {
25
- default: "h-lt-control-md px-4 py-2 has-[>svg]:px-3",
29
+ md: "h-lt-control-md px-4 py-2 has-[>svg]:px-3",
26
30
  sm: "h-lt-control-sm rounded-lt-sm px-3 has-[>svg]:px-2.5",
27
31
  lg: "h-lt-control-lg rounded-lt-sm px-6 has-[>svg]:px-4",
28
32
  icon: "size-lt-control-md"
29
33
  }
30
34
  },
35
+ compoundVariants: [
36
+ {
37
+ emphasis: "solid",
38
+ variant: "primary",
39
+ class: "bg-lt-primary text-lt-primary-fg hover:bg-lt-primary-hover active:bg-lt-primary-active"
40
+ },
41
+ {
42
+ emphasis: "solid",
43
+ variant: "secondary",
44
+ class: "bg-lt-secondary text-lt-secondary-fg hover:bg-lt-secondary-hover active:bg-lt-secondary-active"
45
+ },
46
+ {
47
+ emphasis: "solid",
48
+ variant: "success",
49
+ class: "bg-lt-success text-lt-success-fg hover:bg-lt-success-hover active:bg-lt-success-active"
50
+ },
51
+ {
52
+ emphasis: "solid",
53
+ variant: "info",
54
+ class: "bg-lt-info text-lt-info-fg hover:bg-lt-info-hover active:bg-lt-info-active"
55
+ },
56
+ {
57
+ emphasis: "solid",
58
+ variant: "warning",
59
+ class: "bg-lt-warning text-lt-warning-fg hover:bg-lt-warning-hover active:bg-lt-warning-active"
60
+ },
61
+ {
62
+ emphasis: "solid",
63
+ variant: "danger",
64
+ class: "bg-lt-danger text-lt-danger-fg hover:bg-lt-danger-hover active:bg-lt-danger-active focus-visible:ring-lt-danger/20 dark:focus-visible:ring-lt-danger/40"
65
+ },
66
+ {
67
+ emphasis: "outline",
68
+ variant: "primary",
69
+ class: "border-lt-primary/40 text-lt-primary hover:bg-lt-primary/10 hover:text-lt-primary"
70
+ },
71
+ {
72
+ emphasis: "outline",
73
+ variant: "secondary",
74
+ class: "border-lt-secondary text-lt-secondary-fg hover:bg-lt-secondary hover:text-lt-secondary-fg"
75
+ },
76
+ {
77
+ emphasis: "outline",
78
+ variant: "success",
79
+ class: "border-lt-success/40 text-lt-success hover:bg-lt-success/10 hover:text-lt-success"
80
+ },
81
+ {
82
+ emphasis: "outline",
83
+ variant: "info",
84
+ class: "border-lt-info/40 text-lt-info hover:bg-lt-info/10 hover:text-lt-info"
85
+ },
86
+ {
87
+ emphasis: "outline",
88
+ variant: "warning",
89
+ class: "border-lt-warning/40 text-lt-warning hover:bg-lt-warning/10 hover:text-lt-warning"
90
+ },
91
+ {
92
+ emphasis: "outline",
93
+ variant: "danger",
94
+ class: "border-lt-danger/40 text-lt-danger hover:bg-lt-danger/10 hover:text-lt-danger"
95
+ },
96
+ {
97
+ emphasis: "ghost",
98
+ variant: "primary",
99
+ class: "text-lt-primary hover:bg-lt-primary/10 hover:text-lt-primary"
100
+ },
101
+ {
102
+ emphasis: "ghost",
103
+ variant: "secondary",
104
+ class: "text-lt-secondary-fg hover:bg-lt-secondary hover:text-lt-secondary-fg"
105
+ },
106
+ {
107
+ emphasis: "ghost",
108
+ variant: "success",
109
+ class: "text-lt-success hover:bg-lt-success/10 hover:text-lt-success"
110
+ },
111
+ {
112
+ emphasis: "ghost",
113
+ variant: "info",
114
+ class: "text-lt-info hover:bg-lt-info/10 hover:text-lt-info"
115
+ },
116
+ {
117
+ emphasis: "ghost",
118
+ variant: "warning",
119
+ class: "text-lt-warning hover:bg-lt-warning/10 hover:text-lt-warning"
120
+ },
121
+ {
122
+ emphasis: "ghost",
123
+ variant: "danger",
124
+ class: "text-lt-danger hover:bg-lt-danger/10 hover:text-lt-danger"
125
+ },
126
+ {
127
+ emphasis: "link",
128
+ variant: "primary",
129
+ class: "text-lt-primary"
130
+ },
131
+ {
132
+ emphasis: "link",
133
+ variant: "secondary",
134
+ class: "text-lt-secondary-fg"
135
+ },
136
+ {
137
+ emphasis: "link",
138
+ variant: "success",
139
+ class: "text-lt-success"
140
+ },
141
+ {
142
+ emphasis: "link",
143
+ variant: "info",
144
+ class: "text-lt-info"
145
+ },
146
+ {
147
+ emphasis: "link",
148
+ variant: "warning",
149
+ class: "text-lt-warning"
150
+ },
151
+ {
152
+ emphasis: "link",
153
+ variant: "danger",
154
+ class: "text-lt-danger"
155
+ }
156
+ ],
31
157
  defaultVariants: {
32
- variant: "default",
33
- size: "default"
158
+ emphasis: "solid",
159
+ size: "md"
34
160
  }
35
161
  });
36
- function Button({ className, variant, size, asChild = false, icon, children, ...props }) {
162
+ /**
163
+ * Solid and link buttons read as primary when no variant is given; outline and
164
+ * ghost stay neutral so chrome buttons do not turn teal by default.
165
+ */
166
+ function resolveButtonVariant(emphasis, variant) {
167
+ if (variant) return variant;
168
+ return (emphasis ?? "solid") === "solid" || emphasis === "link" ? "primary" : void 0;
169
+ }
170
+ function Button({ className, variant, emphasis, size, asChild = false, icon, children, ...props }) {
37
171
  const Comp = asChild ? Slot : "button";
38
172
  const content = icon && !asChild ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Icon, {
39
173
  name: icon,
@@ -42,7 +176,8 @@ function Button({ className, variant, size, asChild = false, icon, children, ...
42
176
  return /* @__PURE__ */ jsx(Comp, {
43
177
  "data-slot": "button",
44
178
  className: cn(buttonVariants({
45
- variant,
179
+ emphasis,
180
+ variant: resolveButtonVariant(emphasis, variant),
46
181
  size,
47
182
  className
48
183
  })),
@@ -52,10 +187,11 @@ function Button({ className, variant, size, asChild = false, icon, children, ...
52
187
  }
53
188
  var ButtonComponent = ({ node }) => {
54
189
  const { label, icon } = node.props;
55
- const variant = node.props.variant ?? "default";
190
+ const variant = node.props.variant ?? null;
191
+ const emphasis = node.props.emphasis ?? "solid";
56
192
  const testId = nodeIdentity(node);
57
193
  const behavior = useClickBehavior(node.props);
58
- const size = icon ? "icon" : "default";
194
+ const size = icon ? "icon" : "md";
59
195
  const content = icon ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(IconRenderer, {
60
196
  className: "size-lt-icon-md",
61
197
  icon
@@ -66,6 +202,7 @@ var ButtonComponent = ({ node }) => {
66
202
  const triggerButton = ({ onClick, processing }) => /* @__PURE__ */ jsx(Button, {
67
203
  "data-test": testId,
68
204
  disabled: processing,
205
+ emphasis,
69
206
  onClick,
70
207
  size,
71
208
  variant,
@@ -74,6 +211,7 @@ var ButtonComponent = ({ node }) => {
74
211
  if (behavior.kind === "navigate") return /* @__PURE__ */ jsx(Button, {
75
212
  asChild: true,
76
213
  "data-test": testId,
214
+ emphasis,
77
215
  variant,
78
216
  size,
79
217
  children: /* @__PURE__ */ jsx(Link, {
@@ -92,6 +230,7 @@ var ButtonComponent = ({ node }) => {
92
230
  });
93
231
  return /* @__PURE__ */ jsx(Button, {
94
232
  "data-test": testId,
233
+ emphasis,
95
234
  size,
96
235
  type: node.props.buttonType,
97
236
  variant,
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","names":[],"sources":["../../resources/js/ui/button.tsx"],"sourcesContent":["import { Link } from \"@inertiajs/react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { Icon, IconRenderer } from \"@lattice-php/lattice/icons\";\nimport { nodeIdentity } from \"@lattice-php/lattice/core/test-id\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { ActionTrigger, type TriggerState, useClickBehavior } from \"./click-behavior\";\nimport type { ButtonVariant } from \"@lattice-php/lattice/types/generated\";\n\nexport type { ButtonVariant };\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lt-sm text-base font-medium transition-[color,box-shadow] disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-lt-icon-md [&_svg]:shrink-0 outline-none focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[3px] aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger\",\n {\n variants: {\n variant: {\n default:\n \"bg-lt-primary text-lt-primary-fg shadow-lt-xs hover:bg-lt-primary-hover active:bg-lt-primary-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none\",\n destructive:\n \"bg-lt-danger text-lt-danger-fg shadow-lt-xs hover:bg-lt-danger-hover active:bg-lt-danger-active focus-visible:ring-lt-danger/20 dark:focus-visible:ring-lt-danger/40 disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none\",\n success:\n \"bg-lt-success text-lt-success-fg shadow-lt-xs hover:bg-lt-success-hover active:bg-lt-success-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none\",\n info: \"bg-lt-info text-lt-info-fg shadow-lt-xs hover:bg-lt-info-hover active:bg-lt-info-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none\",\n outline:\n \"border border-lt-input bg-lt-bg shadow-lt-xs hover:bg-lt-accent hover:text-lt-accent-fg disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:border-transparent disabled:shadow-none\",\n secondary:\n \"bg-lt-secondary text-lt-secondary-fg shadow-lt-xs hover:bg-lt-secondary-hover active:bg-lt-secondary-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none\",\n ghost: \"hover:bg-lt-accent hover:text-lt-accent-fg disabled:text-lt-disabled-fg\",\n link: \"text-lt-primary underline-offset-4 hover:underline disabled:text-lt-disabled-fg disabled:no-underline\",\n },\n size: {\n default: \"h-lt-control-md px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-lt-control-sm rounded-lt-sm px-3 has-[>svg]:px-2.5\",\n lg: \"h-lt-control-lg rounded-lt-sm px-6 has-[>svg]:px-4\",\n icon: \"size-lt-control-md\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n icon,\n children,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n /** Leading icon glyph. Ignored with `asChild` (Slot needs a single child). */\n icon?: string;\n }) {\n const Comp = asChild ? Slot : \"button\";\n const content =\n icon && !asChild ? (\n <>\n <Icon name={icon} aria-hidden=\"true\" />\n {children}\n </>\n ) : (\n children\n );\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n >\n {content}\n </Comp>\n );\n}\n\nconst ButtonComponent: RendererComponent<\"button\"> = ({ node }) => {\n const { label, icon } = node.props;\n const variant = node.props.variant ?? \"default\";\n const testId = nodeIdentity(node);\n const behavior = useClickBehavior(node.props);\n const size = icon ? \"icon\" : \"default\";\n const content = icon ? (\n <>\n <IconRenderer className=\"size-lt-icon-md\" icon={icon} />\n {label ? <span className=\"sr-only\">{label}</span> : null}\n </>\n ) : (\n label\n );\n\n const triggerButton = ({ onClick, processing }: TriggerState) => (\n <Button\n data-test={testId}\n disabled={processing}\n onClick={onClick}\n size={size}\n variant={variant}\n >\n {content}\n </Button>\n );\n\n if (behavior.kind === \"navigate\") {\n return (\n <Button asChild data-test={testId} variant={variant} size={size}>\n <Link href={behavior.href} method={behavior.method}>\n {content}\n </Link>\n </Button>\n );\n }\n\n if (behavior.kind === \"action\") {\n return <ActionTrigger action={behavior.action}>{triggerButton}</ActionTrigger>;\n }\n\n if (behavior.kind === \"effects\") {\n return triggerButton({ onClick: behavior.onClick, processing: false });\n }\n\n return (\n <Button data-test={testId} size={size} type={node.props.buttonType} variant={variant}>\n {content}\n </Button>\n );\n};\n\nexport default ButtonComponent;\nexport { Button, buttonVariants };\n"],"mappings":";;;;;;;;;;;AAaA,IAAM,iBAAiB,IACrB,+bACA;CACE,UAAU;EACR,SAAS;GACP,SACE;GACF,aACE;GACF,SACE;GACF,MAAM;GACN,SACE;GACF,WACE;GACF,OAAO;GACP,MAAM;EACR;EACA,MAAM;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,MAAM;EACR;CACF;CACA,iBAAiB;EACf,SAAS;EACT,MAAM;CACR;AACF,CACF;AAEA,SAAS,OAAO,EACd,WACA,SACA,MACA,UAAU,OACV,MACA,UACA,GAAG,SAMA;CACH,MAAM,OAAO,UAAU,OAAO;CAC9B,MAAM,UACJ,QAAQ,CAAC,UACP,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,MAAD;EAAM,MAAM;EAAM,eAAY;CAAQ,CAAA,GACrC,QACD,EAAA,CAAA,IAEF;CAGJ,OACE,oBAAC,MAAD;EACE,aAAU;EACV,WAAW,GAAG,eAAe;GAAE;GAAS;GAAM;EAAU,CAAC,CAAC;EAC1D,GAAI;YAEH;CACG,CAAA;AAEV;AAEA,IAAM,mBAAgD,EAAE,WAAW;CACjE,MAAM,EAAE,OAAO,SAAS,KAAK;CAC7B,MAAM,UAAU,KAAK,MAAM,WAAW;CACtC,MAAM,SAAS,aAAa,IAAI;CAChC,MAAM,WAAW,iBAAiB,KAAK,KAAK;CAC5C,MAAM,OAAO,OAAO,SAAS;CAC7B,MAAM,UAAU,OACd,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,cAAD;EAAc,WAAU;EAAwB;CAAO,CAAA,GACtD,QAAQ,oBAAC,QAAD;EAAM,WAAU;YAAW;CAAY,CAAA,IAAI,IACpD,EAAA,CAAA,IAEF;CAGF,MAAM,iBAAiB,EAAE,SAAS,iBAChC,oBAAC,QAAD;EACE,aAAW;EACX,UAAU;EACD;EACH;EACG;YAER;CACK,CAAA;CAGV,IAAI,SAAS,SAAS,YACpB,OACE,oBAAC,QAAD;EAAQ,SAAA;EAAQ,aAAW;EAAiB;EAAe;YACzD,oBAAC,MAAD;GAAM,MAAM,SAAS;GAAM,QAAQ,SAAS;aACzC;EACG,CAAA;CACA,CAAA;CAIZ,IAAI,SAAS,SAAS,UACpB,OAAO,oBAAC,eAAD;EAAe,QAAQ,SAAS;YAAS;CAA6B,CAAA;CAG/E,IAAI,SAAS,SAAS,WACpB,OAAO,cAAc;EAAE,SAAS,SAAS;EAAS,YAAY;CAAM,CAAC;CAGvE,OACE,oBAAC,QAAD;EAAQ,aAAW;EAAc;EAAM,MAAM,KAAK,MAAM;EAAqB;YAC1E;CACK,CAAA;AAEZ"}
1
+ {"version":3,"file":"button.js","names":[],"sources":["../../resources/js/ui/button.tsx"],"sourcesContent":["import { Link } from \"@inertiajs/react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { Icon, IconRenderer } from \"@lattice-php/lattice/icons\";\nimport { nodeIdentity } from \"@lattice-php/lattice/core/test-id\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { ActionTrigger, type TriggerState, useClickBehavior } from \"./click-behavior\";\nimport type { Emphasis, Variant } from \"@lattice-php/lattice/types/generated\";\n\nexport type { Emphasis, Variant };\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lt-sm text-base font-medium transition-[color,box-shadow] disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-lt-icon-md [&_svg]:shrink-0 outline-none focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[length:var(--lt-ring-width)] aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger\",\n {\n variants: {\n emphasis: {\n solid:\n \"shadow-lt-xs disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none\",\n outline:\n \"border border-lt-input bg-lt-bg shadow-lt-xs hover:bg-lt-accent hover:text-lt-accent-fg disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:border-transparent disabled:shadow-none\",\n ghost: \"hover:bg-lt-accent hover:text-lt-accent-fg disabled:text-lt-disabled-fg\",\n link: \"underline-offset-4 hover:underline disabled:text-lt-disabled-fg disabled:no-underline\",\n },\n variant: {\n primary: \"\",\n secondary: \"\",\n success: \"\",\n info: \"\",\n warning: \"\",\n danger: \"\",\n },\n size: {\n md: \"h-lt-control-md px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-lt-control-sm rounded-lt-sm px-3 has-[>svg]:px-2.5\",\n lg: \"h-lt-control-lg rounded-lt-sm px-6 has-[>svg]:px-4\",\n icon: \"size-lt-control-md\",\n },\n },\n compoundVariants: [\n {\n emphasis: \"solid\",\n variant: \"primary\",\n class:\n \"bg-lt-primary text-lt-primary-fg hover:bg-lt-primary-hover active:bg-lt-primary-active\",\n },\n {\n emphasis: \"solid\",\n variant: \"secondary\",\n class:\n \"bg-lt-secondary text-lt-secondary-fg hover:bg-lt-secondary-hover active:bg-lt-secondary-active\",\n },\n {\n emphasis: \"solid\",\n variant: \"success\",\n class:\n \"bg-lt-success text-lt-success-fg hover:bg-lt-success-hover active:bg-lt-success-active\",\n },\n {\n emphasis: \"solid\",\n variant: \"info\",\n class: \"bg-lt-info text-lt-info-fg hover:bg-lt-info-hover active:bg-lt-info-active\",\n },\n {\n emphasis: \"solid\",\n variant: \"warning\",\n class:\n \"bg-lt-warning text-lt-warning-fg hover:bg-lt-warning-hover active:bg-lt-warning-active\",\n },\n {\n emphasis: \"solid\",\n variant: \"danger\",\n class:\n \"bg-lt-danger text-lt-danger-fg hover:bg-lt-danger-hover active:bg-lt-danger-active focus-visible:ring-lt-danger/20 dark:focus-visible:ring-lt-danger/40\",\n },\n {\n emphasis: \"outline\",\n variant: \"primary\",\n class: \"border-lt-primary/40 text-lt-primary hover:bg-lt-primary/10 hover:text-lt-primary\",\n },\n {\n emphasis: \"outline\",\n variant: \"secondary\",\n class:\n \"border-lt-secondary text-lt-secondary-fg hover:bg-lt-secondary hover:text-lt-secondary-fg\",\n },\n {\n emphasis: \"outline\",\n variant: \"success\",\n class: \"border-lt-success/40 text-lt-success hover:bg-lt-success/10 hover:text-lt-success\",\n },\n {\n emphasis: \"outline\",\n variant: \"info\",\n class: \"border-lt-info/40 text-lt-info hover:bg-lt-info/10 hover:text-lt-info\",\n },\n {\n emphasis: \"outline\",\n variant: \"warning\",\n class: \"border-lt-warning/40 text-lt-warning hover:bg-lt-warning/10 hover:text-lt-warning\",\n },\n {\n emphasis: \"outline\",\n variant: \"danger\",\n class: \"border-lt-danger/40 text-lt-danger hover:bg-lt-danger/10 hover:text-lt-danger\",\n },\n {\n emphasis: \"ghost\",\n variant: \"primary\",\n class: \"text-lt-primary hover:bg-lt-primary/10 hover:text-lt-primary\",\n },\n {\n emphasis: \"ghost\",\n variant: \"secondary\",\n class: \"text-lt-secondary-fg hover:bg-lt-secondary hover:text-lt-secondary-fg\",\n },\n {\n emphasis: \"ghost\",\n variant: \"success\",\n class: \"text-lt-success hover:bg-lt-success/10 hover:text-lt-success\",\n },\n {\n emphasis: \"ghost\",\n variant: \"info\",\n class: \"text-lt-info hover:bg-lt-info/10 hover:text-lt-info\",\n },\n {\n emphasis: \"ghost\",\n variant: \"warning\",\n class: \"text-lt-warning hover:bg-lt-warning/10 hover:text-lt-warning\",\n },\n {\n emphasis: \"ghost\",\n variant: \"danger\",\n class: \"text-lt-danger hover:bg-lt-danger/10 hover:text-lt-danger\",\n },\n { emphasis: \"link\", variant: \"primary\", class: \"text-lt-primary\" },\n { emphasis: \"link\", variant: \"secondary\", class: \"text-lt-secondary-fg\" },\n { emphasis: \"link\", variant: \"success\", class: \"text-lt-success\" },\n { emphasis: \"link\", variant: \"info\", class: \"text-lt-info\" },\n { emphasis: \"link\", variant: \"warning\", class: \"text-lt-warning\" },\n { emphasis: \"link\", variant: \"danger\", class: \"text-lt-danger\" },\n ],\n defaultVariants: {\n emphasis: \"solid\",\n size: \"md\",\n },\n },\n);\n\n/**\n * Solid and link buttons read as primary when no variant is given; outline and\n * ghost stay neutral so chrome buttons do not turn teal by default.\n */\nfunction resolveButtonVariant(\n emphasis: Emphasis | null | undefined,\n variant: Variant | null | undefined,\n): Variant | undefined {\n if (variant) {\n return variant;\n }\n\n return (emphasis ?? \"solid\") === \"solid\" || emphasis === \"link\" ? \"primary\" : undefined;\n}\n\nfunction Button({\n className,\n variant,\n emphasis,\n size,\n asChild = false,\n icon,\n children,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n /** Leading icon glyph. Ignored with `asChild` (Slot needs a single child). */\n icon?: string;\n }) {\n const Comp = asChild ? Slot : \"button\";\n const content =\n icon && !asChild ? (\n <>\n <Icon name={icon} aria-hidden=\"true\" />\n {children}\n </>\n ) : (\n children\n );\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(\n buttonVariants({\n emphasis,\n variant: resolveButtonVariant(emphasis, variant),\n size,\n className,\n }),\n )}\n {...props}\n >\n {content}\n </Comp>\n );\n}\n\nconst ButtonComponent: RendererComponent<\"button\"> = ({ node }) => {\n const { label, icon } = node.props;\n const variant = node.props.variant ?? null;\n const emphasis = node.props.emphasis ?? \"solid\";\n const testId = nodeIdentity(node);\n const behavior = useClickBehavior(node.props);\n const size = icon ? \"icon\" : \"md\";\n const content = icon ? (\n <>\n <IconRenderer className=\"size-lt-icon-md\" icon={icon} />\n {label ? <span className=\"sr-only\">{label}</span> : null}\n </>\n ) : (\n label\n );\n\n const triggerButton = ({ onClick, processing }: TriggerState) => (\n <Button\n data-test={testId}\n disabled={processing}\n emphasis={emphasis}\n onClick={onClick}\n size={size}\n variant={variant}\n >\n {content}\n </Button>\n );\n\n if (behavior.kind === \"navigate\") {\n return (\n <Button asChild data-test={testId} emphasis={emphasis} variant={variant} size={size}>\n <Link href={behavior.href} method={behavior.method}>\n {content}\n </Link>\n </Button>\n );\n }\n\n if (behavior.kind === \"action\") {\n return <ActionTrigger action={behavior.action}>{triggerButton}</ActionTrigger>;\n }\n\n if (behavior.kind === \"effects\") {\n return triggerButton({ onClick: behavior.onClick, processing: false });\n }\n\n return (\n <Button\n data-test={testId}\n emphasis={emphasis}\n size={size}\n type={node.props.buttonType}\n variant={variant}\n >\n {content}\n </Button>\n );\n};\n\nexport default ButtonComponent;\nexport { Button, buttonVariants };\n"],"mappings":";;;;;;;;;;;AAaA,IAAM,iBAAiB,IACrB,udACA;CACE,UAAU;EACR,UAAU;GACR,OACE;GACF,SACE;GACF,OAAO;GACP,MAAM;EACR;EACA,SAAS;GACP,SAAS;GACT,WAAW;GACX,SAAS;GACT,MAAM;GACN,SAAS;GACT,QAAQ;EACV;EACA,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,MAAM;EACR;CACF;CACA,kBAAkB;EAChB;GACE,UAAU;GACV,SAAS;GACT,OACE;EACJ;EACA;GACE,UAAU;GACV,SAAS;GACT,OACE;EACJ;EACA;GACE,UAAU;GACV,SAAS;GACT,OACE;EACJ;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OACE;EACJ;EACA;GACE,UAAU;GACV,SAAS;GACT,OACE;EACJ;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OACE;EACJ;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GAAE,UAAU;GAAQ,SAAS;GAAW,OAAO;EAAkB;EACjE;GAAE,UAAU;GAAQ,SAAS;GAAa,OAAO;EAAuB;EACxE;GAAE,UAAU;GAAQ,SAAS;GAAW,OAAO;EAAkB;EACjE;GAAE,UAAU;GAAQ,SAAS;GAAQ,OAAO;EAAe;EAC3D;GAAE,UAAU;GAAQ,SAAS;GAAW,OAAO;EAAkB;EACjE;GAAE,UAAU;GAAQ,SAAS;GAAU,OAAO;EAAiB;CACjE;CACA,iBAAiB;EACf,UAAU;EACV,MAAM;CACR;AACF,CACF;;;;;AAMA,SAAS,qBACP,UACA,SACqB;CACrB,IAAI,SACF,OAAO;CAGT,QAAQ,YAAY,aAAa,WAAW,aAAa,SAAS,YAAY,KAAA;AAChF;AAEA,SAAS,OAAO,EACd,WACA,SACA,UACA,MACA,UAAU,OACV,MACA,UACA,GAAG,SAMA;CACH,MAAM,OAAO,UAAU,OAAO;CAC9B,MAAM,UACJ,QAAQ,CAAC,UACP,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,MAAD;EAAM,MAAM;EAAM,eAAY;CAAQ,CAAA,GACrC,QACD,EAAA,CAAA,IAEF;CAGJ,OACE,oBAAC,MAAD;EACE,aAAU;EACV,WAAW,GACT,eAAe;GACb;GACA,SAAS,qBAAqB,UAAU,OAAO;GAC/C;GACA;EACF,CAAC,CACH;EACA,GAAI;YAEH;CACG,CAAA;AAEV;AAEA,IAAM,mBAAgD,EAAE,WAAW;CACjE,MAAM,EAAE,OAAO,SAAS,KAAK;CAC7B,MAAM,UAAU,KAAK,MAAM,WAAW;CACtC,MAAM,WAAW,KAAK,MAAM,YAAY;CACxC,MAAM,SAAS,aAAa,IAAI;CAChC,MAAM,WAAW,iBAAiB,KAAK,KAAK;CAC5C,MAAM,OAAO,OAAO,SAAS;CAC7B,MAAM,UAAU,OACd,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,cAAD;EAAc,WAAU;EAAwB;CAAO,CAAA,GACtD,QAAQ,oBAAC,QAAD;EAAM,WAAU;YAAW;CAAY,CAAA,IAAI,IACpD,EAAA,CAAA,IAEF;CAGF,MAAM,iBAAiB,EAAE,SAAS,iBAChC,oBAAC,QAAD;EACE,aAAW;EACX,UAAU;EACA;EACD;EACH;EACG;YAER;CACK,CAAA;CAGV,IAAI,SAAS,SAAS,YACpB,OACE,oBAAC,QAAD;EAAQ,SAAA;EAAQ,aAAW;EAAkB;EAAmB;EAAe;YAC7E,oBAAC,MAAD;GAAM,MAAM,SAAS;GAAM,QAAQ,SAAS;aACzC;EACG,CAAA;CACA,CAAA;CAIZ,IAAI,SAAS,SAAS,UACpB,OAAO,oBAAC,eAAD;EAAe,QAAQ,SAAS;YAAS;CAA6B,CAAA;CAG/E,IAAI,SAAS,SAAS,WACpB,OAAO,cAAc;EAAE,SAAS,SAAS;EAAS,YAAY;CAAM,CAAC;CAGvE,OACE,oBAAC,QAAD;EACE,aAAW;EACD;EACJ;EACN,MAAM,KAAK,MAAM;EACR;YAER;CACK,CAAA;AAEZ"}
@@ -38,15 +38,17 @@ var tooltipProps = {
38
38
  labelStyle: { color: "var(--lt-muted-fg)" }
39
39
  };
40
40
  var palette = [
41
- "var(--lt-primary)",
42
- "var(--lt-success)",
43
- "var(--lt-info)",
44
- "var(--lt-warning)",
45
- "var(--lt-danger)",
46
- "var(--lt-muted-fg)"
41
+ "var(--lt-chart-1)",
42
+ "var(--lt-chart-2)",
43
+ "var(--lt-chart-3)",
44
+ "var(--lt-chart-4)",
45
+ "var(--lt-chart-5)",
46
+ "var(--lt-chart-6)",
47
+ "var(--lt-chart-7)",
48
+ "var(--lt-chart-8)"
47
49
  ];
48
50
  function colorAt(index) {
49
- return palette[index % palette.length] ?? "var(--lt-primary)";
51
+ return palette[index % palette.length] ?? "var(--lt-chart-1)";
50
52
  }
51
53
  function datumColor(datum, series, index) {
52
54
  if (isRecord(datum)) {