@rogieking/figui3 9.4.13 → 10.0.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.
@@ -49,7 +49,7 @@ Data-driven (no authored options):
49
49
  ```
50
50
 
51
51
  - Auto `slot="panel"` if missing. Use `slot="panel"` when the panel is slotted (rich / verbose options).
52
- - First `fig-separator` child is auto-`borderless`. `sticky` pins the label while scrolling.
52
+ - A leading labeled `fig-separator` omits its rule. `sticky` pins the label while scrolling.
53
53
  - Overflow adds `.overflow-start` / `.overflow-end`. Sticky `top` sits below the overflow chevron (`--fig-vertical-overflow-size`).
54
54
  - Methods: `syncOverflow()`, `scrollToOption(option, behavior)`.
55
55
  - Options stay in light DOM. Author them as React children.
@@ -15,7 +15,7 @@ Observed: `value`, `disabled`, `selected`, `label`.
15
15
 
16
16
  - Auto `slot="panel"` if missing
17
17
  - Unwraps a legacy nested `fig-chooser`
18
- - First `fig-separator` child gets `borderless`
18
+ - A leading labeled `fig-separator` omits its rule
19
19
  - Overflow nav buttons: `data-fig-select-nav`, classes `overflow-start` / `overflow-end`
20
20
  - Methods: `syncOverflow()`, `scrollToOption(option, behavior)`
21
21
 
@@ -455,7 +455,8 @@ Handlers below assume `onInput` / `onChange` / `onClick` from [react.md](react.m
455
455
  <fig-separator label="Darken" sticky />
456
456
  ```
457
457
 
458
- - Attrs: `label`, `sticky`, `borderless`. First separator in a panel is auto-`borderless`.
458
+ - Attrs: `label`, `sticky`.
459
+ - `label` generates a child `<label>`; an authored child `<label>` is preserved instead.
459
460
 
460
461
  ### `fig-menu` / `fig-menu-item`
461
462
 
@@ -103,7 +103,7 @@ Toast: `theme`, `duration`, `offset`, `dismiss`, `live="polite|assertive"`, `ico
103
103
  - `position`, `offset`, `closedby="auto|any|none"`, `open`
104
104
  - Items stay in light DOM and slot into the popup (do not relocate)
105
105
  - Items: `fig-menu-item` (`value`, `disabled`, `subtle`). Also a list row outside `fig-menu` (popup, sticky separators, nested row `fig-menu`).
106
- - Dividers: `fig-separator` / `fig-menu-separator` (`label`, `sticky`, `borderless`)
106
+ - Dividers: `fig-separator` / `fig-menu-separator` (`label`, `sticky`)
107
107
  - Popup uses `popover="manual"` (top layer) and stays in the menu shadow so slots keep working
108
108
 
109
109
  ## Color / fill values
package/CHANGELOG.md CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [10.0.0]
6
+
7
+ ### Added
8
+
9
+ - Added a vertical separator playground example.
10
+
11
+ ### Changed
12
+
13
+ - `fig-separator` labels now render as child `<label>` elements and preserve authored labels.
14
+ - Removed the `borderless` separator attribute; leading labeled menu and select separators now omit their rule automatically.
15
+ - Refined separator spacing and sticky behavior, and reduced chooser selection-ring thickness.
16
+
17
+ ### Fixed
18
+
19
+ - Visual-only `fig-select-option` rows no longer render stray ellipses or extra height.
20
+
5
21
  ## [9.4.13]
6
22
 
7
23
  ### Changed
package/README.md CHANGED
@@ -1386,12 +1386,11 @@ Escape dismisses an open tooltip and returns focus to its trigger.
1386
1386
 
1387
1387
  `<fig-separator>` — [demo](https://rog.ie/figui3/#separator)
1388
1388
 
1389
- A visual divider between content groups. The optional `label` attribute adds a group label and accessible name. Add `borderless` to hide the separator line. `<fig-menu-separator>` is a backwards-compatible alias.
1389
+ A visual divider between content groups. The optional `label` attribute adds a group label and accessible name. `<fig-menu-separator>` is a backwards-compatible alias.
1390
1390
 
1391
1391
  ```html
1392
1392
  <fig-separator></fig-separator>
1393
1393
  <fig-separator label="More"></fig-separator>
1394
- <fig-separator label="First group" borderless></fig-separator>
1395
1394
  <fig-menu-separator></fig-menu-separator>
1396
1395
  ```
1397
1396
 
@@ -1451,7 +1450,7 @@ Popup list (no wrapping `fig-menu`):
1451
1450
  </dialog>
1452
1451
  ```
1453
1452
 
1454
- `fig-separator` and `fig-menu-separator` accept optional `label` — renders the rule, then secondary group text underneath.
1453
+ `fig-separator` and `fig-menu-separator` accept optional `label` — renders the rule, then a generated `<label>` with secondary group text underneath. An authored child `<label>` takes precedence and is preserved.
1455
1454
 
1456
1455
  ---
1457
1456
 
package/components.css CHANGED
@@ -6075,7 +6075,7 @@ fig-chooser {
6075
6075
  --fig-chooser-inline-padding: var(--spacer-2);
6076
6076
  --fig-chooser-block-padding: var(--spacer-2);
6077
6077
  --fig-chooser-inline-margin: 0px;
6078
- --fig-choice-selection-ring-width: 2px;
6078
+ --fig-choice-selection-ring-width: 1.5px;
6079
6079
  --fig-choice-selection-ring-gutter: calc(
6080
6080
  var(--fig-choice-selection-ring-width) * 2
6081
6081
  );
@@ -6850,69 +6850,58 @@ fig-menu-item {
6850
6850
  :is(fig-separator, fig-menu-separator) {
6851
6851
  --fig-separator-color: var(--figma-color-border);
6852
6852
  --fig-separator-label-color: var(--figma-color-text-secondary);
6853
- --fig-separator-padding: 0 var(--spacer-4,1rem);
6853
+ --fig-separator-margin-block: var(--spacer-2,0.5rem);
6854
+ --fig-separator-padding-block: 0;
6855
+ --fig-separator-padding-inline: var(--spacer-4,1rem);
6854
6856
 
6855
6857
  display: block;
6856
6858
  box-sizing: border-box;
6857
6859
  flex-shrink: 0;
6858
6860
  width: 100%;
6859
6861
  height: 1px;
6860
- margin: var(--spacer-2,0.5rem) 0;
6861
- padding: var(--fig-separator-padding);
6862
+ margin-block: var(--fig-separator-margin-block);
6863
+ margin-inline: 0;
6864
+ padding-block: var(--fig-separator-padding-block);
6865
+ padding-inline: var(--fig-separator-padding-inline);
6862
6866
  border: 0;
6863
- background: var(--fig-separator-color);
6867
+ border-block-start: 1px solid var(--fig-separator-color);
6868
+ background: transparent;
6864
6869
  color: var(--fig-separator-label-color);
6865
6870
  font-weight: var(--body-medium-fontWeight);
6866
6871
  pointer-events: none;
6867
6872
  user-select: none;
6868
6873
 
6869
6874
  &[direction="vertical"] {
6875
+ --fig-separator-margin-block: 0;
6870
6876
  align-self: stretch;
6871
6877
  width: 1px;
6872
6878
  max-width: 1px;
6873
6879
  height: auto;
6874
6880
  min-height: var(--spacer-3);
6875
- margin: 0;
6876
6881
  padding: 0;
6882
+ border-block-start: 0;
6883
+ border-inline-start: 1px solid var(--fig-separator-color);
6877
6884
  }
6878
6885
 
6879
- &[borderless]:not([borderless="false"]) {
6880
- background: transparent;
6881
-
6882
- &[label]:not([label=""])::before {
6883
- display: none;
6884
- }
6886
+ & > label {
6887
+ display: block;
6888
+ line-height: var(--spacer-4,1rem);
6889
+ min-height: var(--spacer-4,1rem);
6890
+ overflow: hidden;
6891
+ text-overflow: ellipsis;
6892
+ white-space: nowrap;
6885
6893
  }
6886
6894
 
6887
6895
  /* Labeled: rule, then secondary group label (same pattern as menu optgroups). */
6888
- &[label]:not([label=""]) {
6889
- display: flex;
6890
- flex-direction: column;
6891
- gap: var(--spacer-2,0.5rem);
6896
+ &:has(> label) {
6897
+ --fig-separator-margin-block: var(--spacer-2,0.5rem) var(--spacer-1,0.25rem);
6898
+ --fig-separator-padding-block: var(--spacer-2,0.5rem) 0;
6892
6899
  height: auto;
6893
- margin: var(--spacer-2,0.5rem) 0;
6894
- margin-bottom: var(--spacer-1,0.25rem);
6895
- background: transparent;
6896
6900
 
6897
- &:first-of-type,
6898
- &:first-child {
6899
- margin-top: 0;
6900
- }
6901
-
6902
- &::before {
6903
- content: "";
6904
- display: block;
6905
- height: 1px;
6906
- margin-inline: calc(-1 * var(--spacer-4,1rem));
6907
- background: var(--fig-separator-color);
6908
- }
6909
-
6910
- &::after {
6911
- content: attr(label);
6912
- display: block;
6913
- color: var(--fig-separator-label-color);
6914
- line-height: var(--spacer-4,1rem);
6915
- min-height: var(--spacer-4,1rem);
6901
+ &:first-child{
6902
+ --fig-separator-padding-block: 0;
6903
+ --fig-separator-color: transparent;
6904
+ --fig-separator-margin-block: 0;
6916
6905
  }
6917
6906
 
6918
6907
  &[sticky]:not([sticky="false"]) {
@@ -6922,38 +6911,23 @@ fig-menu-item {
6922
6911
  background: var(--fig-popup-bg-color, var(--figma-color-bg));
6923
6912
 
6924
6913
  &[stuck] {
6925
- --fig-separator-padding: var(--spacer-2,0.5rem) var(--spacer-4,1rem);
6926
- &::before {
6927
- display: none;
6928
- }
6914
+ --fig-separator-padding-block: var(--fig-separator-stuck-padding-block, var(--spacer-2,0.5rem));
6915
+ --fig-separator-padding-inline: var(--spacer-4,1rem);
6916
+ --fig-separator-color: transparent;
6929
6917
  }
6930
6918
  }
6931
6919
  }
6932
6920
  }
6933
6921
 
6934
- :is(fig-select-options, .fig-menu-options, fig-menu).overflow-start
6935
- > :is(fig-separator, fig-menu-separator)[label]:not([label=""])[sticky]:not([sticky="false"]) {
6936
- top: var(--fig-vertical-overflow-size, var(--spacer-4, 1rem)) !important;
6937
- }
6938
-
6939
- dialog[is="fig-popup"][theme="menu"]
6940
- :is(fig-separator, fig-menu-separator):first-child[label]:not([label=""])::before,
6941
- fig-select-options > :is(fig-separator, fig-menu-separator):first-child[label]:not([label=""])::before {
6942
- display: none;
6943
- }
6944
-
6945
- dialog[is="fig-popup"][theme="menu"] :is(fig-separator, fig-menu-separator),
6946
- fig-menu > :is(fig-separator, fig-menu-separator),
6947
- fig-select-options > :is(fig-separator, fig-menu-separator) {
6948
- --fig-separator-color: var(--figma-color-border-menu);
6949
- --fig-separator-label-color: var(--figma-color-text-menu-secondary);
6950
- }
6951
-
6952
6922
  fig-menu > :is(fig-separator, fig-menu-separator) {
6953
- --fig-separator-padding: 0 var(--spacer-4,1rem) 0 var(--spacer-3,0.75rem);
6923
+ --fig-separator-padding-inline: var(--spacer-3,0.75rem) var(--spacer-4,1rem);
6924
+ }
6954
6925
 
6955
- &[label]:not([label=""])::before {
6956
- margin-inline-start: calc(-1 * var(--spacer-3,0.75rem));
6957
- margin-inline-end: calc(-1 * var(--spacer-4,1rem));
6958
- }
6926
+ fig-select-options > :is(fig-separator, fig-menu-separator):has(> label):first-child,
6927
+ fig-select-options > [data-fig-select-nav="start"] + :is(fig-separator, fig-menu-separator):has(> label),
6928
+ fig-menu > [slot="trigger"] + :is(fig-separator, fig-menu-separator):has(> label) {
6929
+ --fig-separator-padding-block: 0;
6930
+ --fig-separator-stuck-padding-block: 0;
6931
+ --fig-separator-color: transparent;
6932
+ --fig-separator-margin-block: 0;
6959
6933
  }