@godxjp/ui 23.3.0 → 23.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/components/data-display/card.d.ts +87 -1
  2. package/dist/components/data-display/card.js +88 -15
  3. package/dist/components/data-display/index.d.ts +5 -1
  4. package/dist/components/data-display/index.js +5 -0
  5. package/dist/components/data-display/thought-chain.d.ts +42 -0
  6. package/dist/components/data-display/thought-chain.js +177 -0
  7. package/dist/components/data-display/welcome.d.ts +26 -0
  8. package/dist/components/data-display/welcome.js +37 -0
  9. package/dist/components/data-entry/attachments.d.ts +19 -0
  10. package/dist/components/data-entry/attachments.js +322 -0
  11. package/dist/components/data-entry/index.d.ts +2 -0
  12. package/dist/components/data-entry/index.js +2 -0
  13. package/dist/components/feedback/dialog.d.ts +10 -7
  14. package/dist/components/feedback/dialog.js +40 -17
  15. package/dist/components/feedback/index.d.ts +1 -1
  16. package/dist/components/general/actions.d.ts +59 -0
  17. package/dist/components/general/actions.js +253 -0
  18. package/dist/components/general/activity.js +1 -0
  19. package/dist/components/general/float-button.d.ts +41 -0
  20. package/dist/components/general/float-button.js +336 -0
  21. package/dist/components/general/index.d.ts +6 -2
  22. package/dist/components/general/index.js +12 -1
  23. package/dist/components/general/typography.d.ts +79 -4
  24. package/dist/components/general/typography.js +598 -54
  25. package/dist/components/layout/draggable-panel.d.ts +18 -0
  26. package/dist/components/layout/draggable-panel.js +189 -0
  27. package/dist/components/layout/index.d.ts +2 -0
  28. package/dist/components/layout/index.js +2 -0
  29. package/dist/components/navigation/conversations.d.ts +39 -0
  30. package/dist/components/navigation/conversations.js +371 -0
  31. package/dist/components/navigation/index.d.ts +2 -0
  32. package/dist/components/navigation/index.js +2 -0
  33. package/dist/components/ui/card.js +1 -0
  34. package/dist/i18n/messages/en.json +53 -0
  35. package/dist/i18n/messages/ja.json +53 -0
  36. package/dist/i18n/messages/vi.json +53 -0
  37. package/dist/props/components/data-display.prop.d.ts +143 -1
  38. package/dist/props/components/data-entry.prop.d.ts +76 -0
  39. package/dist/props/components/feedback.prop.d.ts +34 -1
  40. package/dist/props/components/general.prop.d.ts +440 -3
  41. package/dist/props/components/index.d.ts +2 -2
  42. package/dist/props/components/layout.prop.d.ts +63 -1
  43. package/dist/props/components/navigation.prop.d.ts +150 -0
  44. package/dist/props/registry.d.ts +426 -0
  45. package/dist/props/registry.js +546 -0
  46. package/dist/props/vocabulary/index.d.ts +1 -1
  47. package/dist/props/vocabulary/interaction.prop.d.ts +113 -0
  48. package/dist/styles/card-layout.css +30 -0
  49. package/dist/styles/core.css +1 -0
  50. package/dist/styles/data-display-layout.css +236 -0
  51. package/dist/styles/float-button-layout.css +168 -0
  52. package/dist/styles/index.css +1 -0
  53. package/dist/styles/layout.css +196 -0
  54. package/dist/styles/navigation-layout.css +139 -0
  55. package/dist/styles/text-layout.css +156 -0
  56. package/dist/tokens/base.css +7 -0
  57. package/dist/tokens/components/actions.css +14 -0
  58. package/dist/tokens/components/attachments.css +15 -0
  59. package/dist/tokens/components/conversations.css +28 -0
  60. package/dist/tokens/components/draggable-panel.css +25 -0
  61. package/dist/tokens/components/float-button.css +39 -0
  62. package/dist/tokens/components/text.css +13 -0
  63. package/dist/tokens/components/thought-chain.css +31 -0
  64. package/dist/tokens/components/welcome.css +19 -0
  65. package/dist/tokens/foundation.css +2 -0
  66. package/docs/DESIGN-AUTHORITY.md +89 -0
  67. package/docs/FRAME-COVERAGE-REPORT.md +5 -2
  68. package/docs/data-display/card/examples/tab-list.tsx +97 -0
  69. package/docs/data-display/thought-chain.tsx +176 -0
  70. package/docs/data-display/welcome.tsx +115 -0
  71. package/docs/data-entry/attachments.tsx +160 -0
  72. package/docs/feedback/dialog.tsx +50 -0
  73. package/docs/general/actions.tsx +175 -0
  74. package/docs/general/float-button.tsx +133 -0
  75. package/docs/general/typography.tsx +63 -1
  76. package/docs/layout/draggable-panel.tsx +127 -0
  77. package/docs/navigation/conversations.tsx +176 -0
  78. package/docs/roadmap/parity-audit-layout-navigation-general.md +17 -16
  79. package/package.json +3 -3
@@ -2,6 +2,7 @@
2
2
  * Interaction & visual variant prop types.
3
3
  * @see docs/PROPS-VOCABULARY.md#interaction-variants
4
4
  */
5
+ import type * as React from "react";
5
6
  /**
6
7
  * Button visual style.
7
8
  *
@@ -51,6 +52,118 @@ export type TextAlignProp = "start" | "center" | "end";
51
52
  * remaining CSS keywords (`pre`, `pre-line`, `nowrap`) are values on the same axis, not more flags.
52
53
  */
53
54
  export type TextWhitespaceProp = "normal" | "pre-wrap";
55
+ /**
56
+ * antd `Typography` `type` — its four-value emphasis axis (`BaseType`).
57
+ *
58
+ * This library already publishes the same axis as `TextToneProp`, which is WIDER (it also carries
59
+ * `default`, `primary` and `info`) and which every existing call site is written in. Both spellings
60
+ * are accepted on `Text` / `Title` / `Paragraph` / `Link`; **`tone` WINS when both are passed**,
61
+ * because `tone` is the vocabulary `check:prop-vocabulary` governs and the one the CSS keys on.
62
+ * The fold is `secondary → muted`, `danger → destructive`, `success` / `warning` unchanged.
63
+ */
64
+ export type TypographyTypeProp = "secondary" | "success" | "warning" | "danger";
65
+ /**
66
+ * antd `Typography.Title` `level` — 1…5.
67
+ *
68
+ * `HeadingLevelProp` stops at 4 because `--heading-h4` is already 12.5px, BELOW the 14px body step.
69
+ * antd's fifth level is carried here rather than widened into `HeadingLevelProp`, so `Heading` —
70
+ * used across the package and at consumer call sites — keeps the four levels its tokens actually
71
+ * define while `Title` reaches antd's five. Level 5 reads `--heading-h5`, which is bound to the
72
+ * existing `--font-size-2xs` step (≈11.1px); it is not a new number.
73
+ */
74
+ export type TitleLevelProp = 1 | 2 | 3 | 4 | 5;
75
+ /**
76
+ * antd `CopyConfig` — the copy affordance beside a run of text.
77
+ *
78
+ * `format: "text/html"` reaches the real `ClipboardItem` path. `tooltips` takes `false` to suppress
79
+ * the tooltip, one node for both states, or `[copy, copied]` for each.
80
+ */
81
+ export type TypographyCopyConfigProp = {
82
+ /** Text to copy. A function may be async — it is awaited. Defaults to the rendered children. */
83
+ text?: string | (() => string | Promise<string>);
84
+ /** Fired AFTER the write resolves. Never fired when the clipboard refuses — see the component. */
85
+ onCopy?: (event?: React.MouseEvent<HTMLButtonElement>) => void;
86
+ /** Icon node, or `[copy, copied]` for the two states. */
87
+ icon?: React.ReactNode;
88
+ /** Tooltip text: `false` suppresses it, a node replaces both, `[copy, copied]` sets each. */
89
+ tooltips?: React.ReactNode;
90
+ /** `text/html` also writes an HTML flavour to the clipboard. Default `text/plain`. */
91
+ format?: "text/plain" | "text/html";
92
+ /** Tab order of the copy button. */
93
+ tabIndex?: number;
94
+ };
95
+ /** antd `EditConfig` — in-place editing of a run of text. */
96
+ export type TypographyEditConfigProp = {
97
+ /** The value to edit. Falls back to the children when they are a plain string. */
98
+ text?: string;
99
+ /** Controlled editing state. */
100
+ editing?: boolean;
101
+ /** Icon node for the edit trigger. */
102
+ icon?: React.ReactNode;
103
+ /** Tooltip on the edit trigger; `false` suppresses it. */
104
+ tooltip?: React.ReactNode;
105
+ /** Fired when editing starts. */
106
+ onStart?: () => void;
107
+ /** Fired with the TRIMMED value when editing is confirmed (Enter, or blur). */
108
+ onChange?: (value: string) => void;
109
+ /** Fired when editing is abandoned (Escape). */
110
+ onCancel?: () => void;
111
+ /** Fired after Enter confirms — NOT after a blur, matching antd. */
112
+ onEnd?: () => void;
113
+ /** Character ceiling on the editing textarea. */
114
+ maxLength?: number;
115
+ /** Auto-grow the textarea. `true`, or `{ minRows, maxRows }`. Default `true`. */
116
+ autoSize?: boolean | {
117
+ minRows?: number;
118
+ maxRows?: number;
119
+ };
120
+ /** What opens the editor: the icon, the text itself, or both. Default `["icon"]`. */
121
+ triggerType?: ("icon" | "text")[];
122
+ /** Node shown in the editor's corner; `null` removes it. */
123
+ enterIcon?: React.ReactNode;
124
+ /** Tab order of the edit button. */
125
+ tabIndex?: number;
126
+ };
127
+ /**
128
+ * antd `EllipsisConfig` — the truncation contract.
129
+ *
130
+ * `Text` already carries this library's own `truncate` (one line) and `clamp` (N lines). All three
131
+ * spellings are accepted and **`ellipsis` WINS** when they collide, because it is the only one that
132
+ * can carry an expand control, a suffix or a tooltip.
133
+ */
134
+ export type TypographyEllipsisConfigProp = {
135
+ /** Lines kept before truncating. Default 1. */
136
+ rows?: number;
137
+ /** Show an expand control. `"collapsible"` also keeps a collapse control once expanded. */
138
+ expandable?: boolean | "collapsible";
139
+ /** Text pinned AFTER the ellipsis (a unit, a count). */
140
+ suffix?: string;
141
+ /** The expand/collapse label — a node, or a function of the current state. */
142
+ symbol?: React.ReactNode | ((expanded: boolean) => React.ReactNode);
143
+ /** Uncontrolled initial expanded state. */
144
+ defaultExpanded?: boolean;
145
+ /** Controlled expanded state. */
146
+ expanded?: boolean;
147
+ /** Fired when the expand/collapse control is used. */
148
+ onExpand?: (e: React.MouseEvent<HTMLElement>, info: {
149
+ expanded: boolean;
150
+ }) => void;
151
+ /** Fired when the measured overflow state flips. */
152
+ onEllipsis?: (ellipsis: boolean) => void;
153
+ /** Tooltip carrying the full text while it is truncated. `true` uses the children. */
154
+ tooltip?: React.ReactNode;
155
+ };
156
+ /**
157
+ * antd `ActionsConfig` — which side of the text the copy / edit / expand cluster sits on.
158
+ *
159
+ * The name is antd's. `PROP_ALIASES_FORBIDDEN` reserves the bare word `actions` for a ReactNode
160
+ * SLOT (`ActionsProp`, toolbars); this is not that — it is a placement config for controls the
161
+ * component renders itself, and antd's spelling wins per DESIGN-AUTHORITY's prop-surface rule.
162
+ * `start` / `end` are logical, so they mirror in RTL.
163
+ */
164
+ export type TypographyActionsConfigProp = {
165
+ placement?: "start" | "end";
166
+ };
54
167
  /** Badge visual style. */
55
168
  export type BadgeVariantProp = "default" | "secondary" | "outline" | "dashed";
56
169
  /**
@@ -333,6 +333,36 @@
333
333
  padding-inline: 0;
334
334
  }
335
335
 
336
+ [data-slot="card"] > [data-slot="tabs"] {
337
+
338
+ gap: 0;
339
+
340
+ flex: 1 1 auto;
341
+ min-inline-size: 0;
342
+ }
343
+
344
+ [data-slot="card"] > [data-slot="tabs"] > [data-slot="tabs-panel"] {
345
+ padding: 0;
346
+ }
347
+
348
+ [data-slot="card"][data-tab-list] > [data-slot="card-header"]:not([data-banded]) {
349
+ padding-bottom: var(--card-space-body-y);
350
+ }
351
+
352
+ [data-slot="card"]
353
+ > [data-slot="tabs"]
354
+ > .ui-tabs-bar
355
+ > [data-slot="tabs-extra"][data-side="end"] {
356
+ padding-inline-end: var(--card-space-inset);
357
+ }
358
+
359
+ [data-slot="card"]
360
+ > [data-slot="tabs"]
361
+ > .ui-tabs-bar
362
+ > [data-slot="tabs-extra"][data-side="start"] {
363
+ padding-inline-start: var(--card-space-inset);
364
+ }
365
+
336
366
  [data-slot="card-footer"] {
337
367
  display: flex;
338
368
  flex-wrap: wrap;
@@ -22,3 +22,4 @@
22
22
  @import "./form-layout.css";
23
23
  @import "./navigation-layout.css";
24
24
  @import "./chart-layout.css";
25
+ @import "./float-button-layout.css";
@@ -1812,3 +1812,239 @@
1812
1812
  background: var(--tree-node-selected-background, hsl(var(--primary) / 0.12));
1813
1813
  }
1814
1814
  }
1815
+
1816
+ @layer components {
1817
+
1818
+ .ui-welcome {
1819
+ display: flex;
1820
+ min-inline-size: 0;
1821
+ align-items: flex-start;
1822
+ gap: var(--welcome-gap);
1823
+ border-radius: var(--welcome-radius);
1824
+ }
1825
+
1826
+ .ui-welcome[data-variant="filled"] {
1827
+ padding-block: var(--welcome-padding-block);
1828
+ padding-inline: var(--welcome-padding-inline);
1829
+ border: var(--welcome-filled-border, var(--stroke-hairline) solid hsl(var(--border)));
1830
+ background: var(--welcome-filled-background, hsl(var(--muted)));
1831
+ }
1832
+
1833
+ .ui-welcome-icon {
1834
+ display: grid;
1835
+ inline-size: var(--welcome-icon-size);
1836
+ block-size: var(--welcome-icon-size);
1837
+ flex: 0 0 auto;
1838
+ line-height: 0;
1839
+ place-items: center;
1840
+ }
1841
+
1842
+ .ui-welcome-icon svg,
1843
+ .ui-welcome-icon img {
1844
+ inline-size: var(--welcome-icon-size);
1845
+ block-size: var(--welcome-icon-size);
1846
+ object-fit: contain;
1847
+ }
1848
+
1849
+ .ui-welcome-content {
1850
+ display: flex;
1851
+ min-inline-size: 0;
1852
+ flex: 1 1 auto;
1853
+ flex-direction: column;
1854
+ gap: var(--welcome-content-gap);
1855
+ }
1856
+
1857
+ .ui-welcome-title-row {
1858
+ display: flex;
1859
+ min-inline-size: 0;
1860
+ align-items: flex-start;
1861
+ justify-content: space-between;
1862
+ gap: var(--welcome-title-gap);
1863
+ }
1864
+
1865
+ .ui-welcome-title {
1866
+ min-inline-size: 0;
1867
+ }
1868
+
1869
+ .ui-welcome-extra {
1870
+ flex: 0 0 auto;
1871
+ }
1872
+ }
1873
+
1874
+ @layer components {
1875
+
1876
+ .ui-thought-chain {
1877
+ display: flex;
1878
+ min-inline-size: 0;
1879
+ flex-direction: column;
1880
+ margin: 0;
1881
+ padding: 0;
1882
+ gap: var(--thought-chain-gap);
1883
+ list-style: none;
1884
+ }
1885
+
1886
+ .ui-thought-chain-node {
1887
+ position: relative;
1888
+ display: flex;
1889
+ min-inline-size: 0;
1890
+ align-items: flex-start;
1891
+ gap: var(--thought-chain-node-gap);
1892
+ }
1893
+
1894
+ .ui-thought-chain:not([data-line="none"]) .ui-thought-chain-node:not(:last-child)::before {
1895
+ position: absolute;
1896
+ inset-block: var(--thought-chain-icon-size) calc(-1 * var(--thought-chain-gap));
1897
+ inset-inline-start: calc(var(--thought-chain-icon-size) / 2);
1898
+ border-inline-start: var(--thought-chain-line-width) solid
1899
+ var(--thought-chain-line-color, hsl(var(--border)));
1900
+ content: "";
1901
+ translate: calc(-1 * var(--thought-chain-line-width) / 2) 0;
1902
+ }
1903
+
1904
+ .ui-thought-chain[data-line="dashed"] .ui-thought-chain-node::before {
1905
+ border-inline-start-style: dashed;
1906
+ }
1907
+
1908
+ .ui-thought-chain[data-line="dotted"] .ui-thought-chain-node::before {
1909
+ border-inline-start-style: dotted;
1910
+ }
1911
+
1912
+ .ui-thought-chain-icon {
1913
+ position: relative;
1914
+ z-index: 1;
1915
+ display: grid;
1916
+ inline-size: var(--thought-chain-icon-size);
1917
+ block-size: var(--thought-chain-icon-size);
1918
+ flex: 0 0 auto;
1919
+ border-radius: var(--thought-chain-icon-radius);
1920
+ background: var(--thought-chain-icon-background, hsl(var(--muted)));
1921
+ color: var(--thought-chain-icon-color, hsl(var(--muted-foreground)));
1922
+ font-size: var(--thought-chain-icon-font-size);
1923
+ place-items: center;
1924
+ }
1925
+
1926
+ .ui-thought-chain-icon svg {
1927
+ inline-size: var(--thought-chain-chevron-size);
1928
+ block-size: var(--thought-chain-chevron-size);
1929
+ }
1930
+
1931
+ .ui-thought-chain-icon[data-status="success"] {
1932
+ color: var(--thought-chain-icon-success-color, hsl(var(--success)));
1933
+ }
1934
+
1935
+ .ui-thought-chain-icon[data-status="error"] {
1936
+ color: var(--thought-chain-icon-error-color, hsl(var(--destructive)));
1937
+ }
1938
+
1939
+ .ui-thought-chain-body {
1940
+ display: flex;
1941
+ min-inline-size: 0;
1942
+ flex: 1 1 auto;
1943
+ flex-direction: column;
1944
+ gap: var(--thought-chain-body-gap);
1945
+ }
1946
+
1947
+ .ui-thought-chain-header {
1948
+ display: flex;
1949
+ min-inline-size: 0;
1950
+ flex-direction: column;
1951
+ gap: var(--thought-chain-body-gap);
1952
+ }
1953
+
1954
+ .ui-thought-chain-trigger {
1955
+ display: flex;
1956
+ min-inline-size: 0;
1957
+ align-items: center;
1958
+ gap: var(--thought-chain-item-gap);
1959
+ border: 0;
1960
+ padding: 0;
1961
+ background: transparent;
1962
+ color: inherit;
1963
+ cursor: pointer;
1964
+ font: inherit;
1965
+ text-align: start;
1966
+ }
1967
+
1968
+ .ui-thought-chain-chevron {
1969
+ inline-size: var(--thought-chain-chevron-size);
1970
+ block-size: var(--thought-chain-chevron-size);
1971
+ flex: 0 0 auto;
1972
+ }
1973
+
1974
+ [dir="rtl"] .ui-thought-chain-chevron {
1975
+ scale: -1 1;
1976
+ }
1977
+
1978
+ .ui-thought-chain-chevron[data-expanded="true"],
1979
+ [dir="rtl"] .ui-thought-chain-chevron[data-expanded="true"] {
1980
+ rotate: 90deg;
1981
+ scale: 1 1;
1982
+ }
1983
+
1984
+ .ui-thought-chain-content {
1985
+ padding-block: var(--thought-chain-content-space-block);
1986
+ }
1987
+
1988
+ @keyframes ui-thought-chain-blink {
1989
+ 50% {
1990
+ opacity: 0.45;
1991
+ }
1992
+ }
1993
+
1994
+ .ui-thought-chain [data-blink],
1995
+ .ui-thought-chain-item[data-blink] {
1996
+ animation: ui-thought-chain-blink var(--duration-slow) ease-in-out infinite;
1997
+ }
1998
+
1999
+ .ui-thought-chain-spinner {
2000
+ animation: spin var(--duration-slow) linear infinite;
2001
+ }
2002
+
2003
+ @media (prefers-reduced-motion: reduce) {
2004
+ .ui-thought-chain [data-blink],
2005
+ .ui-thought-chain-item[data-blink],
2006
+ .ui-thought-chain-spinner {
2007
+ animation: none;
2008
+ }
2009
+ }
2010
+
2011
+ .ui-thought-chain-item {
2012
+ display: inline-flex;
2013
+ align-items: center;
2014
+ gap: var(--thought-chain-item-gap);
2015
+ padding-block: var(--thought-chain-item-padding-block);
2016
+ padding-inline: var(--thought-chain-item-padding-inline);
2017
+ border: 0;
2018
+ border-radius: var(--thought-chain-item-radius);
2019
+ background: transparent;
2020
+ color: inherit;
2021
+ font: inherit;
2022
+ text-align: start;
2023
+ }
2024
+
2025
+ .ui-thought-chain-item[data-variant="solid"] {
2026
+ background: var(--thought-chain-item-solid-background, hsl(var(--muted)));
2027
+ }
2028
+
2029
+ .ui-thought-chain-item[data-variant="outlined"] {
2030
+ border: var(
2031
+ --thought-chain-item-outlined-border,
2032
+ var(--stroke-hairline) solid hsl(var(--border))
2033
+ );
2034
+ }
2035
+
2036
+ button.ui-thought-chain-item {
2037
+ cursor: pointer;
2038
+ }
2039
+
2040
+ button.ui-thought-chain-item:disabled {
2041
+ cursor: not-allowed;
2042
+ opacity: var(--disabled-opacity);
2043
+ }
2044
+
2045
+ .ui-thought-chain-item-text {
2046
+ display: flex;
2047
+ min-inline-size: 0;
2048
+ flex-direction: column;
2049
+ }
2050
+ }
@@ -0,0 +1,168 @@
1
+
2
+
3
+ @layer components {
4
+
5
+ .ui-float-button {
6
+ position: fixed;
7
+ z-index: var(--overlay-z-index);
8
+ inset-block-end: var(--float-button-offset-block-end);
9
+ inset-inline-end: var(--float-button-offset-inline-end);
10
+ box-shadow: var(--float-button-shadow);
11
+ }
12
+
13
+ .ui-float-button-group .ui-float-button {
14
+ position: relative;
15
+ inset: auto;
16
+ pointer-events: auto;
17
+ }
18
+
19
+ .ui-float-button[data-shape="square"] {
20
+ display: flex;
21
+ flex-direction: column;
22
+ block-size: auto;
23
+ inline-size: var(--float-button-size);
24
+ min-block-size: var(--float-button-min-block-size);
25
+ padding-block: var(--float-button-padding-block);
26
+ padding-inline: var(--float-button-padding-inline);
27
+ }
28
+
29
+ .ui-float-button-icon {
30
+ display: inline-flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ }
34
+
35
+ .ui-float-button-icon > svg {
36
+ inline-size: var(--float-button-icon-size);
37
+ block-size: var(--float-button-icon-size);
38
+ }
39
+
40
+ .ui-float-button-content {
41
+ font-size: var(--float-button-content-font-size);
42
+ line-height: var(--float-button-content-line-height);
43
+ text-align: center;
44
+ }
45
+
46
+ .ui-float-button-badge {
47
+ position: absolute;
48
+ z-index: 1;
49
+ inset-block-start: var(--float-button-badge-inset-block-start);
50
+ inset-inline-end: var(--float-button-badge-inset-inline-end);
51
+ display: inline-flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ min-inline-size: var(--float-button-badge-size);
55
+ block-size: var(--float-button-badge-size);
56
+ padding-inline: var(--float-button-badge-padding-inline);
57
+ border-radius: var(--radius-pill);
58
+ background: var(--float-button-badge-background, hsl(var(--destructive)));
59
+ color: var(--float-button-badge-foreground);
60
+ font-size: var(--float-button-badge-font-size);
61
+ font-variant-numeric: tabular-nums;
62
+ line-height: 1;
63
+ }
64
+
65
+ .ui-float-button-badge[data-dot] {
66
+ min-inline-size: var(--float-button-badge-dot-size);
67
+ inline-size: var(--float-button-badge-dot-size);
68
+ block-size: var(--float-button-badge-dot-size);
69
+ padding-inline: 0;
70
+ }
71
+
72
+ .ui-float-button-group {
73
+ position: fixed;
74
+ z-index: var(--overlay-z-index);
75
+ inset-block-end: var(--float-button-offset-block-end);
76
+ inset-inline-end: var(--float-button-offset-inline-end);
77
+ display: flex;
78
+ flex-direction: column;
79
+ align-items: center;
80
+ gap: var(--float-button-group-gap);
81
+ pointer-events: none;
82
+ }
83
+
84
+ .ui-float-button-list {
85
+ display: flex;
86
+ flex-direction: column;
87
+ gap: var(--float-button-group-gap);
88
+ border-radius: var(--float-button-group-radius);
89
+ }
90
+
91
+ .ui-float-button-group:not([data-individual]) .ui-float-button-list {
92
+ gap: 0;
93
+ box-shadow: var(--float-button-shadow);
94
+ }
95
+
96
+ .ui-float-button-group:not([data-individual]) .ui-float-button {
97
+ border-radius: 0;
98
+ box-shadow: none;
99
+ }
100
+
101
+ .ui-float-button-group:not([data-individual]) .ui-float-button-list > :first-child {
102
+ border-start-start-radius: var(--float-button-group-radius);
103
+ border-start-end-radius: var(--float-button-group-radius);
104
+ }
105
+
106
+ .ui-float-button-group:not([data-individual]) .ui-float-button-list > :last-child {
107
+ border-end-start-radius: var(--float-button-group-radius);
108
+ border-end-end-radius: var(--float-button-group-radius);
109
+ }
110
+
111
+ .ui-float-button-group[data-menu-mode] .ui-float-button-list {
112
+ position: absolute;
113
+ }
114
+
115
+ .ui-float-button-group[data-menu-mode][data-placement="top"] .ui-float-button-list {
116
+ inset-block-end: calc(var(--float-button-size) + var(--float-button-group-gap));
117
+ }
118
+
119
+ .ui-float-button-group[data-menu-mode][data-placement="bottom"] .ui-float-button-list {
120
+ inset-block-start: calc(var(--float-button-size) + var(--float-button-group-gap));
121
+ }
122
+
123
+ .ui-float-button-group[data-menu-mode][data-placement="left"] .ui-float-button-list,
124
+ .ui-float-button-group[data-menu-mode][data-placement="right"] .ui-float-button-list {
125
+ flex-direction: row;
126
+ }
127
+
128
+ .ui-float-button-group[data-menu-mode][data-placement="left"] .ui-float-button-list {
129
+ inset-inline-end: calc(var(--float-button-size) + var(--float-button-group-gap));
130
+ }
131
+
132
+ .ui-float-button-group[data-menu-mode][data-placement="right"] .ui-float-button-list {
133
+ inset-inline-start: calc(var(--float-button-size) + var(--float-button-group-gap));
134
+ }
135
+
136
+ .ui-float-button-group[data-menu-mode][data-state="open"] .ui-float-button-list {
137
+ animation: ui-float-button-list-in var(--duration-fast) var(--ease-standard);
138
+ }
139
+
140
+ .ui-float-button-back-top[data-progress]::after {
141
+ position: absolute;
142
+ border-radius: inherit;
143
+ content: "";
144
+ inset: 0;
145
+ background: conic-gradient(
146
+ var(--float-button-progress-color) var(--float-button-progress-offset),
147
+ var(--float-button-progress-track-color) var(--float-button-progress-offset)
148
+ );
149
+ mask: radial-gradient(
150
+ farthest-side,
151
+ transparent calc(100% - var(--float-button-progress-width)),
152
+ #000 calc(100% - var(--float-button-progress-width))
153
+ );
154
+ pointer-events: none;
155
+ }
156
+ }
157
+
158
+ @keyframes ui-float-button-list-in {
159
+ from {
160
+ opacity: 0;
161
+ translate: 0 var(--float-button-motion-translate);
162
+ }
163
+
164
+ to {
165
+ opacity: 1;
166
+ translate: 0 0;
167
+ }
168
+ }
@@ -24,3 +24,4 @@
24
24
  @import "./form-layout.css";
25
25
  @import "./navigation-layout.css";
26
26
  @import "./chart-layout.css";
27
+ @import "./float-button-layout.css";