@rojaostudio/ds 2.0.0-next.11 → 2.0.0-next.13

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 (33) hide show
  1. package/README.md +6 -1
  2. package/THIRD_PARTY_NOTICES.md +1 -1
  3. package/dist/components/choice-carousel.d.ts +1 -1
  4. package/dist/components/choice-carousel.js +2 -4
  5. package/dist/components/choice-preview-card.d.ts +1 -7
  6. package/dist/components/currency-input.d.ts +0 -2
  7. package/dist/components/data-table-header.js +11 -5
  8. package/dist/components/floating-stepper.d.ts +11 -28
  9. package/dist/components/floating-stepper.js +2 -30
  10. package/dist/components/image-crop-dialog.d.ts +60 -0
  11. package/dist/components/image-crop-dialog.js +240 -0
  12. package/dist/components/image-crop-modal.d.ts +12 -55
  13. package/dist/components/image-crop-modal.js +2 -249
  14. package/dist/components/image-upload.d.ts +6 -15
  15. package/dist/components/image-upload.js +2 -2
  16. package/dist/components/index.d.ts +2 -1
  17. package/dist/components/index.js +2 -0
  18. package/dist/components/internal/icons.d.ts +9 -1
  19. package/dist/components/internal/icons.js +16 -0
  20. package/dist/components/number-input.d.ts +1 -1
  21. package/dist/components/section-header.d.ts +4 -3
  22. package/dist/components/selectable-card.d.ts +2 -10
  23. package/dist/components/stepper.d.ts +33 -0
  24. package/dist/components/stepper.js +36 -0
  25. package/dist/components/toast.d.ts +16 -5
  26. package/dist/components/toast.js +5 -3
  27. package/dist/components/toggle-card-compact.d.ts +6 -25
  28. package/dist/components/toggle-card-compact.js +8 -35
  29. package/dist/components/toggle-card.d.ts +23 -9
  30. package/dist/components/toggle-card.js +38 -2
  31. package/package.json +2 -3
  32. package/styles/rds/components-styles.css +78 -69
  33. package/styles/rds/components.css +4 -0
@@ -1,31 +1,12 @@
1
1
  import * as react from 'react';
2
- import { ReactNode } from 'react';
2
+ import { ToggleCardProps } from './toggle-card.js';
3
3
 
4
- interface ToggleCardCompactProps {
5
- /** An icon before the text (the Item's media). */
6
- icon?: ReactNode;
7
- /** The setting it turns on (the Item's title and the Switch's name). */
8
- label: string;
9
- /** The line under the label while off. */
10
- description?: ReactNode;
11
- /** The line under the label while on (a summary of what is set); it replaces `description`. */
12
- summary?: ReactNode;
13
- checked: boolean;
14
- onCheckedChange?: (checked: boolean) => void;
15
- /** Shows the pencil (an IconButton) while on: opens the setting's options (a Dialog). */
16
- onEdit?: () => void;
17
- /** The pencil's accessible name and tooltip. */
18
- editLabel?: string;
19
- /** Submits 'on' (or '') under this name with a native form, through a hidden input. */
20
- name?: string;
21
- disabled?: boolean;
22
- className?: string;
23
- }
4
+ /** @deprecated Use ToggleCardProps (with layout="compact"). */
5
+ type ToggleCardCompactProps = Omit<ToggleCardProps, 'layout' | 'children'>;
24
6
  /**
25
- * ToggleCardCompact — a composition of the Item (outline), the Switch and the IconButton with its Tooltip: a
26
- * setting in one row, its summary under the label while on and a pencil that opens its options. Styles:
27
- * toggle-card-compact.css.
7
+ * @deprecated Use `<ToggleCard layout="compact">` (Figma [RDS] Forms/ToggleCard, layout=compact), with the same
8
+ * props. A thin wrapper over it, kept so the old name keeps compiling; the codemod rewrites it.
28
9
  */
29
- declare function ToggleCardCompact({ icon, label, description, summary, checked, onCheckedChange, onEdit, editLabel, name, disabled, className, }: ToggleCardCompactProps): react.JSX.Element;
10
+ declare function ToggleCardCompact(props: ToggleCardCompactProps): react.JSX.Element;
30
11
 
31
12
  export { ToggleCardCompact, type ToggleCardCompactProps };
@@ -1,39 +1,12 @@
1
1
  "use client";
2
- import "../chunk-ORMEWXMH.js";
3
- import { jsx, jsxs } from "react/jsx-runtime";
4
- import { IconButton } from "./icon-button.js";
5
- import { PencilIcon } from "./internal/icons.js";
6
- import { Item } from "./item.js";
7
- import { Switch } from "./switch.js";
8
- import { Tooltip } from "./tooltip.js";
9
- function ToggleCardCompact({
10
- icon,
11
- label,
12
- description,
13
- summary,
14
- checked,
15
- onCheckedChange,
16
- onEdit,
17
- editLabel = "Editar",
18
- name,
19
- disabled,
20
- className
21
- }) {
22
- return /* @__PURE__ */ jsx(
23
- Item,
24
- {
25
- variant: "outline",
26
- className: ["rds-toggle-card-compact", className].filter(Boolean).join(" "),
27
- media: icon,
28
- title: label,
29
- description: (checked ? summary : description) || void 0,
30
- action: /* @__PURE__ */ jsxs("span", { className: "rds-toggle-card-compact__actions", children: [
31
- name && /* @__PURE__ */ jsx("input", { type: "hidden", name, value: checked ? "on" : "" }),
32
- checked && onEdit && /* @__PURE__ */ jsx(Tooltip, { text: editLabel, children: /* @__PURE__ */ jsx(IconButton, { icon: /* @__PURE__ */ jsx(PencilIcon, {}), label: editLabel, variant: "ghost", tone: "neutral", onClick: onEdit, disabled }) }),
33
- /* @__PURE__ */ jsx(Switch, { "aria-label": label, checked, onCheckedChange, disabled })
34
- ] })
35
- }
36
- );
2
+ import {
3
+ __spreadProps,
4
+ __spreadValues
5
+ } from "../chunk-ORMEWXMH.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { ToggleCard } from "./toggle-card.js";
8
+ function ToggleCardCompact(props) {
9
+ return /* @__PURE__ */ jsx(ToggleCard, __spreadProps(__spreadValues({}, props), { layout: "compact" }));
37
10
  }
38
11
  export {
39
12
  ToggleCardCompact
@@ -1,24 +1,38 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
 
4
+ /** Figma [RDS] Forms/ToggleCard `layout`: the Card with the options below it, or one row (the Item). */
5
+ type ToggleCardLayout = 'default' | 'compact';
4
6
  interface ToggleCardProps {
5
- /** The setting it turns on (the Switch's label). */
7
+ /** `default`: a Card with the Switch and, while on, the options below it. `compact`: one row (an outline Item). */
8
+ layout?: ToggleCardLayout;
9
+ /** The setting it turns on (the Switch's label; in compact, the Item's title and the Switch's name). */
6
10
  label: string;
7
- /** A line under the label (the Switch's hint). */
8
- description?: string;
11
+ /** A line under the label (default: the Switch's hint; compact: shown while off). */
12
+ description?: ReactNode;
13
+ /** Compact only: the line under the label while on (a summary of what is set); it replaces `description`. */
14
+ summary?: ReactNode;
15
+ /** Compact only: an icon before the text (the Item's media). */
16
+ icon?: ReactNode;
9
17
  checked: boolean;
10
- onCheckedChange: (checked: boolean) => void;
18
+ onCheckedChange?: (checked: boolean) => void;
19
+ /** Compact only: shows the pencil (an IconButton) while on; it opens the setting's options (a Dialog). */
20
+ onEdit?: () => void;
21
+ /** Compact only: the pencil's accessible name and tooltip. Default "Editar". */
22
+ editLabel?: string;
11
23
  /** Submits 'on' (or '') under this name with a native form, through a hidden input. */
12
24
  name?: string;
13
- /** The setting's options, shown under it while it is on. */
25
+ /** Default only: the setting's options, shown under it while it is on. */
14
26
  children?: ReactNode;
15
27
  disabled?: boolean;
16
28
  className?: string;
17
29
  }
18
30
  /**
19
- * ToggleCard — a composition of the Card and the Switch (Figma [RDS] Forms/Switch): a setting that, when on, opens
20
- * its own options below it. Styles: toggle-card.css.
31
+ * ToggleCard — Figma [RDS] Forms/ToggleCard: a setting that, when on, opens its own options. `layout="default"` is
32
+ * a composition of the Card and the Switch, the options below it; `layout="compact"` is one row (the Item outline,
33
+ * the Switch and the IconButton with its Tooltip): the summary under the label while on and a pencil that opens the
34
+ * options. Styles: toggle-card.css.
21
35
  */
22
- declare function ToggleCard({ label, description, checked, onCheckedChange, name, children, disabled, className }: ToggleCardProps): react.JSX.Element;
36
+ declare function ToggleCard({ layout, label, description, summary, icon, checked, onCheckedChange, onEdit, editLabel, name, children, disabled, className, }: ToggleCardProps): react.JSX.Element;
23
37
 
24
- export { ToggleCard, type ToggleCardProps };
38
+ export { ToggleCard, type ToggleCardLayout, type ToggleCardProps };
@@ -2,10 +2,46 @@
2
2
  import "../chunk-ORMEWXMH.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { Card } from "./card.js";
5
+ import { IconButton } from "./icon-button.js";
6
+ import { PencilIcon } from "./internal/icons.js";
7
+ import { Item } from "./item.js";
5
8
  import { Switch } from "./switch.js";
6
- function ToggleCard({ label, description, checked, onCheckedChange, name, children, disabled, className }) {
9
+ import { Tooltip } from "./tooltip.js";
10
+ function ToggleCard({
11
+ layout = "default",
12
+ label,
13
+ description,
14
+ summary,
15
+ icon,
16
+ checked,
17
+ onCheckedChange,
18
+ onEdit,
19
+ editLabel = "Editar",
20
+ name,
21
+ children,
22
+ disabled,
23
+ className
24
+ }) {
25
+ const hidden = name && /* @__PURE__ */ jsx("input", { type: "hidden", name, value: checked ? "on" : "" });
26
+ if (layout === "compact") {
27
+ return /* @__PURE__ */ jsx(
28
+ Item,
29
+ {
30
+ variant: "outline",
31
+ className: ["rds-toggle-card", "rds-toggle-card--compact", className].filter(Boolean).join(" "),
32
+ media: icon,
33
+ title: label,
34
+ description: (checked ? summary : description) || void 0,
35
+ action: /* @__PURE__ */ jsxs("span", { className: "rds-toggle-card__actions", children: [
36
+ hidden,
37
+ checked && onEdit && /* @__PURE__ */ jsx(Tooltip, { text: editLabel, children: /* @__PURE__ */ jsx(IconButton, { icon: /* @__PURE__ */ jsx(PencilIcon, {}), label: editLabel, variant: "ghost", tone: "neutral", onClick: onEdit, disabled }) }),
38
+ /* @__PURE__ */ jsx(Switch, { "aria-label": label, checked, onCheckedChange, disabled })
39
+ ] })
40
+ }
41
+ );
42
+ }
7
43
  return /* @__PURE__ */ jsxs(Card, { as: "div", className: ["rds-toggle-card", className].filter(Boolean).join(" "), children: [
8
- name && /* @__PURE__ */ jsx("input", { type: "hidden", name, value: checked ? "on" : "" }),
44
+ hidden,
9
45
  /* @__PURE__ */ jsx("div", { className: "rds-toggle-card__header", children: /* @__PURE__ */ jsx(Switch, { checked, onCheckedChange, hint: description, disabled, children: label }) }),
10
46
  checked && children && /* @__PURE__ */ jsx("div", { className: "rds-toggle-card__content", children })
11
47
  ] });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rojaostudio/ds",
3
- "version": "2.0.0-next.11",
3
+ "version": "2.0.0-next.13",
4
4
  "type": "module",
5
5
  "description": "Rojão Design System — componentes React, estilos e alvo React Native. O motor vive em @rojaostudio/ds-core.",
6
6
  "license": "MIT",
@@ -168,7 +168,6 @@
168
168
  "playwright": "^1.63.0",
169
169
  "react-image-crop": "^11.0.10",
170
170
  "react-international-phone": "^4.8.0",
171
- "ts-morph": "^28.0.0",
172
171
  "tsup": "^8.5.1",
173
172
  "tsx": "^4.21.0",
174
173
  "typescript": "^5",
@@ -208,6 +207,6 @@
208
207
  "lint": "eslint .",
209
208
  "build:brands": "tsx scripts/build-brands.ts",
210
209
  "build:rds": "tsx scripts/build-rds-tokens.ts",
211
- "migrate:consumer": "tsx scripts/migrate-consumer.ts"
210
+ "migrate:consumer": "tsx ../codemod/src/cli.ts"
212
211
  }
213
212
  }
@@ -2978,7 +2978,7 @@ input:focus-visible + .rds-checkbox__box {
2978
2978
  /*
2979
2979
  * ChoiceCarousel: no tokens of its own; the IconButtons bring theirs. A row that scrolls sideways and snaps to each
2980
2980
  * option (160 wide, 200 from 768), 12 apart, no scrollbar. From 768 the outline arrows sit on the row's edges, half
2981
- * outside, and fade away when there is nothing more that way.
2981
+ * outside, and are not there when there is nothing more that way.
2982
2982
  */
2983
2983
  .rds-choice-carousel {
2984
2984
  position: relative;
@@ -3032,7 +3032,6 @@ input:focus-visible + .rds-checkbox__box {
3032
3032
  display: inline-flex;
3033
3033
  border-radius: var(--radius-full);
3034
3034
  box-shadow: var(--elevation-raised);
3035
- transition: opacity var(--motion-duration-base) var(--motion-easing-standard);
3036
3035
  }
3037
3036
 
3038
3037
  .rds-choice-carousel__arrow--prev {
@@ -3044,11 +3043,6 @@ input:focus-visible + .rds-checkbox__box {
3044
3043
  right: 0;
3045
3044
  transform: translate(50%, -50%);
3046
3045
  }
3047
-
3048
- .rds-choice-carousel__arrow[aria-disabled='true'] {
3049
- opacity: 0;
3050
- pointer-events: none;
3051
- }
3052
3046
  }
3053
3047
 
3054
3048
  @media (prefers-reduced-motion: reduce) {
@@ -3584,7 +3578,7 @@ input:focus-visible + .rds-checkbox__box {
3584
3578
  /* components/data-table-header.css */
3585
3579
  /* @tokens data-table-header */
3586
3580
  /*
3587
- * DataTableHeader: no tokens of its own; the Input, FilterChip, Chip, Button, Badge, Separator, DropdownMenu,
3581
+ * DataTableHeader: no tokens of its own; the Input, FilterChip, Chip, Button, Separator, DropdownMenu,
3588
3582
  * Popover and Drawer bring theirs. One row, 8 apart, 12 above the table; the search takes the free width. The wide
3589
3583
  * parts show from 768, the narrow ones below it. In the Popover and the Drawer the filters stack 16 apart, each
3590
3584
  * one a caption-sized label over its chips.
@@ -4405,38 +4399,6 @@ input:focus-visible + .rds-checkbox__box {
4405
4399
  }
4406
4400
  }
4407
4401
 
4408
- /* components/floating-stepper.css */
4409
- /* @tokens floating-stepper */
4410
- /*
4411
- * FloatingStepper: no tokens of its own; the Card and the Buttons bring theirs. A pill (radius/full) of 44 Buttons,
4412
- * 4 inside and 4 apart, raised by elevation/overlay because it floats over the page. A 1 × 24 line in the card's
4413
- * border colour before the action.
4414
- */
4415
- .rds-floating-stepper {
4416
- flex-direction: row;
4417
- align-items: center;
4418
- gap: var(--space-4);
4419
- width: max-content;
4420
- max-width: 100%;
4421
- padding: var(--space-4);
4422
- border-radius: var(--radius-full);
4423
- box-shadow: var(--elevation-overlay);
4424
- overflow-x: auto;
4425
- }
4426
-
4427
- .rds-floating-stepper > .rds-button {
4428
- flex: none;
4429
- border-radius: var(--radius-full);
4430
- }
4431
-
4432
- .rds-floating-stepper__divider {
4433
- flex: none;
4434
- width: var(--border-width);
4435
- height: var(--size-24);
4436
- margin-inline: var(--space-4);
4437
- background: var(--card-border);
4438
- }
4439
-
4440
4402
  /* components/footer.css */
4441
4403
  /* @tokens footer */
4442
4404
  /*
@@ -4901,13 +4863,14 @@ input:focus-visible + .rds-checkbox__box {
4901
4863
  }
4902
4864
  }
4903
4865
 
4904
- /* components/image-crop-modal.css */
4905
- /* @tokens image-crop-modal */
4866
+ /* components/image-crop-dialog.css */
4867
+ /* @tokens image-crop-dialog */
4906
4868
  /*
4907
- * ImageCropModal: no tokens of its own; the Dialog, the ToggleGroup, the Alert and the Spinner bring theirs. 12
4908
- * apart: the presets (they share the width), the stage (at least 300, at most 60% of the viewport, the image
4909
- * letterboxed inside 16 of padding, a line in the dialog's border colour), the error or the hint. While sending,
4910
- * the dialog's scrim covers the image.
4869
+ * ImageCropDialog (Figma [RDS] Overlays/ImageCropDialog): the Dialog, the ToggleGroup, the Alert and the Spinner bring
4870
+ * their tokens; the crop brings its own (Overlays, image-crop-dialog/*). 12 apart: the presets (they share the
4871
+ * width), the stage (320 tall, on image-crop-dialog/stage/background, the image letterboxed inside 16 of padding, a
4872
+ * line in the dialog's border colour), the error or the hint. Over the image, outside the crop, the shade; the crop's
4873
+ * line and its handles in their own colours. While sending, the dialog's scrim covers the stage.
4911
4874
  */
4912
4875
  .rds-image-crop {
4913
4876
  display: flex;
@@ -4930,17 +4893,42 @@ input:focus-visible + .rds-checkbox__box {
4930
4893
  display: flex;
4931
4894
  align-items: center;
4932
4895
  justify-content: center;
4933
- min-height: 300px;
4896
+ height: 320px;
4897
+ /* On a short viewport (a phone on its side) the stage gives way so the footer stays in view. */
4934
4898
  max-height: 60vh;
4935
4899
  padding: var(--space-16);
4936
4900
  overflow: hidden;
4901
+ background: var(--image-crop-dialog-stage-background);
4937
4902
  border: var(--border-width) solid var(--dialog-border);
4938
4903
  border-radius: var(--radius-control);
4939
4904
  }
4940
4905
 
4906
+ /*
4907
+ * react-image-crop's own stylesheet is unlayered, so it wins over these layered rules wherever both set the same
4908
+ * property. The shade is an SVG rect with fill as an attribute (black at 50%): any CSS beats it. The handles read
4909
+ * the library's variables, set here. The selection's marching ants are hard-coded: the two !important take them
4910
+ * off so the crop is one solid line in the selection colour (the library's focus outline stays).
4911
+ */
4941
4912
  .rds-image-crop__crop {
4942
4913
  max-width: 100%;
4943
- max-height: calc(60vh - var(--space-32));
4914
+ max-height: calc(min(320px, 60vh) - var(--space-32));
4915
+ --rc-drag-handle-bg-colour: var(--image-crop-dialog-handle);
4916
+ --rc-border-color: var(--image-crop-dialog-handle);
4917
+ }
4918
+
4919
+ .rds-image-crop__crop .ReactCrop__crop-mask > rect {
4920
+ fill: var(--image-crop-dialog-shade);
4921
+ fill-opacity: 1;
4922
+ }
4923
+
4924
+ .rds-image-crop__crop .ReactCrop__crop-selection {
4925
+ background-image: none !important;
4926
+ border: var(--border-width) solid var(--image-crop-dialog-selection);
4927
+ animation: none !important;
4928
+ }
4929
+
4930
+ .rds-image-crop__crop .ReactCrop__drag-handle {
4931
+ border-radius: var(--radius-xs);
4944
4932
  }
4945
4933
 
4946
4934
  .rds-image-crop__image {
@@ -7358,8 +7346,9 @@ body:has(.rds-modal) {
7358
7346
  /* @tokens page-skeleton */
7359
7347
  /*
7360
7348
  * PageSkeleton and CardsSkeleton: no tokens of their own; the Skeleton and the Card bring theirs. Blocks 24 apart
7361
- * (24 padding when padded). The table is a small Card: the header row on the card's footer background, a line
7362
- * between rows. The cards: 2 per row (4 from 1024), the charts 1 (2 from 1024), 16 apart.
7349
+ * (24 padding when padded). The Cards keep their elevation/raised, as in the Figma. The table is a small Card: the
7350
+ * header row on the card's footer background, a line between rows. The cards: 2 per row (4 from 1024), the charts
7351
+ * 1 (2 from 1024), 16 apart.
7363
7352
  */
7364
7353
  .rds-page-skeleton {
7365
7354
  display: flex;
@@ -7378,10 +7367,6 @@ body:has(.rds-modal) {
7378
7367
  gap: var(--space-16);
7379
7368
  }
7380
7369
 
7381
- .rds-page-skeleton__table {
7382
- box-shadow: none;
7383
- }
7384
-
7385
7370
  .rds-page-skeleton__row {
7386
7371
  display: flex;
7387
7372
  align-items: center;
@@ -7428,7 +7413,6 @@ body:has(.rds-modal) {
7428
7413
  .rds-page-skeleton__card {
7429
7414
  gap: var(--space-12);
7430
7415
  padding: var(--space-16);
7431
- box-shadow: none;
7432
7416
  }
7433
7417
 
7434
7418
  .rds-page-skeleton__card .rds-skeleton {
@@ -9708,6 +9692,35 @@ input:focus-visible + .rds-radio__circle {
9708
9692
  }
9709
9693
  }
9710
9694
 
9695
+ /* components/stepper.css */
9696
+ /* @tokens stepper */
9697
+ /*
9698
+ * Stepper: no tokens of its own; the Card and the Buttons bring theirs. A pill (radius/full) of 44 Buttons,
9699
+ * 4 inside and 4 apart, raised by elevation/overlay because it floats over the page. A vertical Separator, 24
9700
+ * tall, before the action.
9701
+ */
9702
+ .rds-stepper {
9703
+ flex-direction: row;
9704
+ align-items: center;
9705
+ gap: var(--space-4);
9706
+ width: max-content;
9707
+ max-width: 100%;
9708
+ padding: var(--space-4);
9709
+ border-radius: var(--radius-full);
9710
+ box-shadow: var(--elevation-overlay);
9711
+ overflow-x: auto;
9712
+ }
9713
+
9714
+ .rds-stepper > .rds-button {
9715
+ flex: none;
9716
+ border-radius: var(--radius-full);
9717
+ }
9718
+
9719
+ .rds-stepper > .rds-stepper__divider {
9720
+ align-self: center;
9721
+ height: var(--size-24);
9722
+ }
9723
+
9711
9724
  /* components/summary-bar.css */
9712
9725
  /* @tokens summary-bar */
9713
9726
  /*
@@ -10642,23 +10655,13 @@ tbody > tr:last-child > .rds-table__status {
10642
10655
  }
10643
10656
  }
10644
10657
 
10645
- /* components/toggle-card-compact.css */
10646
- /* @tokens toggle-card-compact */
10647
- /*
10648
- * ToggleCardCompact: no tokens of its own; the Item, the Switch and the IconButton bring theirs. The pencil and the
10649
- * Switch 8 apart at the end of the row.
10650
- */
10651
- .rds-toggle-card-compact__actions {
10652
- display: inline-flex;
10653
- align-items: center;
10654
- gap: var(--space-8);
10655
- }
10656
-
10657
10658
  /* components/toggle-card.css */
10658
10659
  /* @tokens toggle-card */
10659
10660
  /*
10660
- * ToggleCard: no tokens of its own; the Card and the Switch bring theirs. The Switch row pads 16 on the sides (4 top and
10661
- * bottom); the options under it pad 16, 16 apart, after a line in the card's border colour.
10661
+ * ToggleCard: no tokens of its own; the Card, the Item, the Switch and the IconButton bring theirs.
10662
+ * layout=default: the Switch row pads 16 on the sides (4 top and bottom); the options under it pad 16, 16 apart,
10663
+ * after a line in the card's border colour.
10664
+ * layout=compact: the outline Item; the pencil and the Switch 8 apart at the end of the row.
10662
10665
  */
10663
10666
  .rds-toggle-card__header {
10664
10667
  padding: var(--space-4) var(--space-16);
@@ -10672,6 +10675,12 @@ tbody > tr:last-child > .rds-table__status {
10672
10675
  border-top: var(--border-width) solid var(--card-border);
10673
10676
  }
10674
10677
 
10678
+ .rds-toggle-card__actions {
10679
+ display: inline-flex;
10680
+ align-items: center;
10681
+ gap: var(--space-8);
10682
+ }
10683
+
10675
10684
  /* components/toggle-group.css */
10676
10685
  /* @tokens toggle-group */
10677
10686
  /* ToggleGroup: Toggles side by side, 4 apart (Figma: slot items, gap space/4). No tokens of its own. */
@@ -1006,5 +1006,9 @@
1006
1006
  --sheet-text: var(--text-body);
1007
1007
  --sheet-title: var(--text-heading);
1008
1008
  --dialog-scrim: var(--surface-scrim);
1009
+ --image-crop-dialog-shade: var(--surface-scrim);
1010
+ --image-crop-dialog-selection: var(--text-on-cover);
1011
+ --image-crop-dialog-handle: var(--text-on-cover);
1012
+ --image-crop-dialog-stage-background: var(--surface-muted);
1009
1013
  }
1010
1014
  }