jvetrau-ds 0.2.2 → 0.2.4

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 (62) hide show
  1. package/components/avatar-upload/avatar-upload.cjs +1 -0
  2. package/components/avatar-upload/avatar-upload.cjs.map +1 -1
  3. package/components/avatar-upload/avatar-upload.js +1 -0
  4. package/components/avatar-upload/avatar-upload.js.map +1 -1
  5. package/components/button/button-presentation.cjs +17 -0
  6. package/components/button/button-presentation.cjs.map +1 -0
  7. package/components/button/button-presentation.d.ts +1 -0
  8. package/components/button/button-presentation.js +15 -0
  9. package/components/button/button-presentation.js.map +1 -0
  10. package/components/button/button.cjs +11 -18
  11. package/components/button/button.cjs.map +1 -1
  12. package/components/button/button.d.ts +4 -3
  13. package/components/button/button.js +12 -19
  14. package/components/button/button.js.map +1 -1
  15. package/components/button/index.cjs +11 -1
  16. package/components/button/index.d.ts +1 -0
  17. package/components/button/index.js +1 -0
  18. package/components/dropdown/dropdown.cjs +103 -26
  19. package/components/dropdown/dropdown.cjs.map +1 -1
  20. package/components/dropdown/dropdown.css +142 -0
  21. package/components/dropdown/dropdown.d.ts +2 -0
  22. package/components/dropdown/dropdown.js +103 -26
  23. package/components/dropdown/dropdown.js.map +1 -1
  24. package/components/flip-list/flip-list.cjs +5 -5
  25. package/components/flip-list/flip-list.cjs.map +1 -1
  26. package/components/flip-list/flip-list.css +20 -24
  27. package/components/flip-list/flip-list.js +4 -5
  28. package/components/flip-list/flip-list.js.map +1 -1
  29. package/components/index.cjs +5 -1
  30. package/components/index.d.ts +3 -2
  31. package/components/index.js +1 -1
  32. package/components/tag/tag.cjs +9 -4
  33. package/components/tag/tag.cjs.map +1 -1
  34. package/components/tag/tag.css +40 -27
  35. package/components/tag/tag.d.ts +2 -1
  36. package/components/tag/tag.js +9 -4
  37. package/components/tag/tag.js.map +1 -1
  38. package/components/video/video.cjs +5 -17
  39. package/components/video/video.cjs.map +1 -1
  40. package/components/video/video.js +5 -16
  41. package/components/video/video.js.map +1 -1
  42. package/icons/assets/close.cjs +14 -0
  43. package/icons/assets/close.cjs.map +1 -0
  44. package/icons/assets/close.d.ts +2 -0
  45. package/icons/assets/close.js +12 -0
  46. package/icons/assets/close.js.map +1 -0
  47. package/icons/manifest.cjs +6 -0
  48. package/icons/manifest.cjs.map +1 -1
  49. package/icons/manifest.d.ts +5 -0
  50. package/icons/manifest.js +6 -0
  51. package/icons/manifest.js.map +1 -1
  52. package/index.cjs +4 -0
  53. package/index.d.ts +2 -2
  54. package/index.js +1 -1
  55. package/package.json +1 -1
  56. package/patterns/header/header.cjs +36 -5
  57. package/patterns/header/header.cjs.map +1 -1
  58. package/patterns/header/header.css +45 -0
  59. package/patterns/header/header.d.ts +14 -2
  60. package/patterns/header/header.js +32 -5
  61. package/patterns/header/header.js.map +1 -1
  62. package/styles.css +246 -50
@@ -75,24 +75,122 @@
75
75
  /* motion */
76
76
  }
77
77
 
78
+ .dropdown__menu::before {
79
+ /* color */
80
+ content: '';
81
+
82
+ /* typography */
83
+
84
+ /* size */
85
+ position: absolute;
86
+
87
+ /* border */
88
+
89
+ /* depth */
90
+
91
+ /* motion */
92
+ }
93
+
78
94
  .dropdown--bottom-start .dropdown__menu {
95
+ /* color */
96
+
97
+ /* typography */
98
+
99
+ /* size */
79
100
  top: calc(100% + var(--dropdown-offset));
80
101
  left: 0;
102
+
103
+ /* border */
104
+
105
+ /* depth */
106
+
107
+ /* motion */
81
108
  }
82
109
 
83
110
  .dropdown--bottom-end .dropdown__menu {
111
+ /* color */
112
+
113
+ /* typography */
114
+
115
+ /* size */
84
116
  top: calc(100% + var(--dropdown-offset));
85
117
  right: 0;
118
+
119
+ /* border */
120
+
121
+ /* depth */
122
+
123
+ /* motion */
86
124
  }
87
125
 
88
126
  .dropdown--top-start .dropdown__menu {
127
+ /* color */
128
+
129
+ /* typography */
130
+
131
+ /* size */
89
132
  bottom: calc(100% + var(--dropdown-offset));
90
133
  left: 0;
134
+
135
+ /* border */
136
+
137
+ /* depth */
138
+
139
+ /* motion */
91
140
  }
92
141
 
93
142
  .dropdown--top-end .dropdown__menu {
143
+ /* color */
144
+
145
+ /* typography */
146
+
147
+ /* size */
94
148
  right: 0;
95
149
  bottom: calc(100% + var(--dropdown-offset));
150
+
151
+ /* border */
152
+
153
+ /* depth */
154
+
155
+ /* motion */
156
+ }
157
+
158
+ .dropdown--bottom-start .dropdown__menu::before,
159
+ .dropdown--bottom-end .dropdown__menu::before {
160
+ /* color */
161
+
162
+ /* typography */
163
+
164
+ /* size */
165
+ top: calc(-1 * var(--dropdown-offset));
166
+ right: 0;
167
+ left: 0;
168
+ height: var(--dropdown-offset);
169
+
170
+ /* border */
171
+
172
+ /* depth */
173
+
174
+ /* motion */
175
+ }
176
+
177
+ .dropdown--top-start .dropdown__menu::before,
178
+ .dropdown--top-end .dropdown__menu::before {
179
+ /* color */
180
+
181
+ /* typography */
182
+
183
+ /* size */
184
+ right: 0;
185
+ bottom: calc(-1 * var(--dropdown-offset));
186
+ left: 0;
187
+ height: var(--dropdown-offset);
188
+
189
+ /* border */
190
+
191
+ /* depth */
192
+
193
+ /* motion */
96
194
  }
97
195
 
98
196
  .dropdown__item {
@@ -136,21 +234,65 @@
136
234
  }
137
235
 
138
236
  .dropdown__item:hover {
237
+ /* color */
139
238
  background: var(--dropdown-item-bg-hover);
239
+
240
+ /* typography */
241
+
242
+ /* size */
243
+
244
+ /* border */
245
+
246
+ /* depth */
247
+
248
+ /* motion */
140
249
  }
141
250
 
142
251
  .dropdown__item--selected {
252
+ /* color */
143
253
  background: var(--dropdown-item-bg-selected);
144
254
  color: var(--dropdown-item-color-selected);
255
+
256
+ /* typography */
257
+
258
+ /* size */
259
+
260
+ /* border */
261
+
262
+ /* depth */
263
+
264
+ /* motion */
145
265
  }
146
266
 
147
267
  .dropdown__item--disabled,
148
268
  .dropdown__item:disabled {
269
+ /* color */
149
270
  color: var(--dropdown-item-color-disabled);
271
+
272
+ /* typography */
273
+
274
+ /* size */
275
+
276
+ /* border */
277
+
278
+ /* depth */
279
+
280
+ /* motion */
150
281
  cursor: not-allowed;
151
282
  }
152
283
 
153
284
  .dropdown__item--disabled:hover,
154
285
  .dropdown__item:disabled:hover {
286
+ /* color */
155
287
  background: transparent;
288
+
289
+ /* typography */
290
+
291
+ /* size */
292
+
293
+ /* border */
294
+
295
+ /* depth */
296
+
297
+ /* motion */
156
298
  }
@@ -5,6 +5,7 @@ export interface DropdownOption {
5
5
  label: string;
6
6
  disabled?: boolean;
7
7
  }
8
+ export type DropdownInteraction = 'click' | 'hover';
8
9
  type DropdownTriggerProps = {
9
10
  className?: string;
10
11
  onClick?: (event: React.MouseEvent) => void;
@@ -18,6 +19,7 @@ export interface DropdownProps extends Omit<React.HTMLAttributes<HTMLDivElement>
18
19
  defaultValue?: string;
19
20
  label?: string;
20
21
  align?: 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end';
22
+ interaction?: DropdownInteraction;
21
23
  trigger: DropdownTriggerElement;
22
24
  onChange?: (value: string) => void;
23
25
  }
@@ -9,36 +9,59 @@ const Dropdown = ({
9
9
  defaultValue,
10
10
  label = "Dropdown",
11
11
  align = "bottom-start",
12
+ interaction = "click",
12
13
  trigger,
13
14
  onChange,
14
15
  className = "",
16
+ onMouseEnter,
17
+ onMouseLeave,
18
+ onFocus,
19
+ onBlur,
15
20
  ...props
16
21
  }) => {
17
22
  const dropdownRef = useRef(null);
18
23
  const [isOpen, setIsOpen] = useState(false);
19
- const [internalValue, setInternalValue] = useState(defaultValue);
24
+ const [
25
+ internalValue,
26
+ setInternalValue
27
+ ] = useState(defaultValue);
20
28
  const selectedValue = value ?? internalValue;
21
- const classes = classnames("dropdown", className, {
22
- "dropdown--open": isOpen,
23
- "dropdown--top-start": align === "top-start",
24
- "dropdown--top-end": align === "top-end",
25
- "dropdown--bottom-start": align === "bottom-start",
26
- "dropdown--bottom-end": align === "bottom-end"
27
- });
29
+ const isHoverInteraction = interaction === "hover";
30
+ const classes = classnames(
31
+ "dropdown",
32
+ className,
33
+ {
34
+ "dropdown--open": isOpen,
35
+ "dropdown--top-start": align === "top-start",
36
+ "dropdown--top-end": align === "top-end",
37
+ "dropdown--bottom-start": align === "bottom-start",
38
+ "dropdown--bottom-end": align === "bottom-end"
39
+ }
40
+ );
28
41
  const triggerElement = trigger;
29
42
  const triggerClasses = classnames(
30
43
  "dropdown__trigger",
31
44
  triggerElement.props.className
32
45
  );
33
- const resolvedTrigger = cloneElement(triggerElement, {
34
- className: triggerClasses,
35
- "aria-haspopup": "menu",
36
- "aria-expanded": isOpen,
37
- onClick: (event) => {
38
- triggerElement.props.onClick?.(event);
39
- setIsOpen((currentValue) => !currentValue);
46
+ const resolvedTrigger = cloneElement(
47
+ triggerElement,
48
+ {
49
+ className: triggerClasses,
50
+ "aria-haspopup": "menu",
51
+ "aria-expanded": isOpen,
52
+ onClick: (event) => {
53
+ triggerElement.props.onClick?.(
54
+ event
55
+ );
56
+ if (isHoverInteraction) {
57
+ return;
58
+ }
59
+ setIsOpen(
60
+ (currentValue) => !currentValue
61
+ );
62
+ }
40
63
  }
41
- });
64
+ );
42
65
  const handleOptionClick = (option) => {
43
66
  if (option.disabled) {
44
67
  return;
@@ -49,13 +72,46 @@ const Dropdown = ({
49
72
  onChange?.(option.value);
50
73
  setIsOpen(false);
51
74
  };
75
+ const handleMouseEnter = (event) => {
76
+ onMouseEnter?.(event);
77
+ if (isHoverInteraction) {
78
+ setIsOpen(true);
79
+ }
80
+ };
81
+ const handleMouseLeave = (event) => {
82
+ onMouseLeave?.(event);
83
+ if (isHoverInteraction) {
84
+ setIsOpen(false);
85
+ }
86
+ };
87
+ const handleFocus = (event) => {
88
+ onFocus?.(event);
89
+ if (isHoverInteraction) {
90
+ setIsOpen(true);
91
+ }
92
+ };
93
+ const handleBlur = (event) => {
94
+ onBlur?.(event);
95
+ if (!isHoverInteraction) {
96
+ return;
97
+ }
98
+ const nextTarget = event.relatedTarget;
99
+ if (nextTarget instanceof Node && event.currentTarget.contains(
100
+ nextTarget
101
+ )) {
102
+ return;
103
+ }
104
+ setIsOpen(false);
105
+ };
52
106
  useEffect(() => {
53
107
  if (!isOpen) {
54
108
  return;
55
109
  }
56
110
  const handleDocumentClick = (event) => {
57
111
  const dropdown = dropdownRef.current;
58
- if (!dropdown || dropdown.contains(event.target)) {
112
+ if (!dropdown || dropdown.contains(
113
+ event.target
114
+ )) {
59
115
  return;
60
116
  }
61
117
  setIsOpen(false);
@@ -65,11 +121,23 @@ const Dropdown = ({
65
121
  setIsOpen(false);
66
122
  }
67
123
  };
68
- document.addEventListener("mousedown", handleDocumentClick);
69
- document.addEventListener("keydown", handleDocumentKeyDown);
124
+ document.addEventListener(
125
+ "mousedown",
126
+ handleDocumentClick
127
+ );
128
+ document.addEventListener(
129
+ "keydown",
130
+ handleDocumentKeyDown
131
+ );
70
132
  return () => {
71
- document.removeEventListener("mousedown", handleDocumentClick);
72
- document.removeEventListener("keydown", handleDocumentKeyDown);
133
+ document.removeEventListener(
134
+ "mousedown",
135
+ handleDocumentClick
136
+ );
137
+ document.removeEventListener(
138
+ "keydown",
139
+ handleDocumentKeyDown
140
+ );
73
141
  };
74
142
  }, [isOpen]);
75
143
  return /* @__PURE__ */ jsxs(
@@ -77,6 +145,10 @@ const Dropdown = ({
77
145
  {
78
146
  ref: dropdownRef,
79
147
  className: classes,
148
+ onMouseEnter: handleMouseEnter,
149
+ onMouseLeave: handleMouseLeave,
150
+ onFocus: handleFocus,
151
+ onBlur: handleBlur,
80
152
  ...props,
81
153
  children: [
82
154
  resolvedTrigger,
@@ -88,10 +160,13 @@ const Dropdown = ({
88
160
  "aria-label": label,
89
161
  children: options.map((option) => {
90
162
  const isSelected = option.value === selectedValue;
91
- const itemClasses = classnames("dropdown__item", {
92
- "dropdown__item--selected": isSelected,
93
- "dropdown__item--disabled": option.disabled
94
- });
163
+ const itemClasses = classnames(
164
+ "dropdown__item",
165
+ {
166
+ "dropdown__item--selected": isSelected,
167
+ "dropdown__item--disabled": option.disabled
168
+ }
169
+ );
95
170
  return /* @__PURE__ */ jsx(
96
171
  "button",
97
172
  {
@@ -101,7 +176,9 @@ const Dropdown = ({
101
176
  "aria-checked": isSelected,
102
177
  "aria-disabled": option.disabled,
103
178
  disabled: option.disabled,
104
- onClick: () => handleOptionClick(option),
179
+ onClick: () => handleOptionClick(
180
+ option
181
+ ),
105
182
  children: option.label
106
183
  },
107
184
  option.value
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/dropdown/dropdown.tsx"],"names":[],"mappings":"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","file":"dropdown.js","sourcesContent":["import React, {\n cloneElement,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport './dropdown.css';\nimport { classnames } from '../helpers/classnames';\n\nexport interface DropdownOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\ntype DropdownTriggerProps = {\n className?: string;\n onClick?: (event: React.MouseEvent) => void;\n 'aria-haspopup'?: string;\n 'aria-expanded'?: boolean;\n};\n\ntype DropdownTriggerElement =\n React.ReactElement<DropdownTriggerProps>;\n\nexport interface DropdownProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n options: DropdownOption[];\n value?: string;\n defaultValue?: string;\n label?: string;\n align?: 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end';\n trigger: DropdownTriggerElement;\n onChange?: (value: string) => void;\n}\n\nconst Dropdown: React.FC<DropdownProps> = ({\n options,\n value,\n defaultValue,\n label = 'Dropdown',\n align = 'bottom-start',\n trigger,\n onChange,\n className = '',\n ...props\n}) => {\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n const [internalValue, setInternalValue] = useState(defaultValue);\n\n const selectedValue =\n value ?? internalValue;\n\n const classes = classnames('dropdown', className, {\n 'dropdown--open': isOpen,\n 'dropdown--top-start': align === 'top-start',\n 'dropdown--top-end': align === 'top-end',\n 'dropdown--bottom-start': align === 'bottom-start',\n 'dropdown--bottom-end': align === 'bottom-end',\n });\n\n const triggerElement =\n trigger as DropdownTriggerElement;\n\n const triggerClasses = classnames(\n 'dropdown__trigger',\n triggerElement.props.className,\n );\n\n const resolvedTrigger = cloneElement(triggerElement, {\n className: triggerClasses,\n 'aria-haspopup': 'menu',\n 'aria-expanded': isOpen,\n onClick: (event: React.MouseEvent) => {\n triggerElement.props.onClick?.(event);\n\n setIsOpen((currentValue) => !currentValue);\n },\n });\n\n const handleOptionClick = (option: DropdownOption) => {\n if (option.disabled) {\n return;\n }\n\n if (value === undefined) {\n setInternalValue(option.value);\n }\n\n onChange?.(option.value);\n setIsOpen(false);\n };\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handleDocumentClick = (event: MouseEvent) => {\n const dropdown = dropdownRef.current;\n\n if (!dropdown || dropdown.contains(event.target as Node)) {\n return;\n }\n\n setIsOpen(false);\n };\n\n const handleDocumentKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleDocumentClick);\n document.addEventListener('keydown', handleDocumentKeyDown);\n\n return () => {\n document.removeEventListener('mousedown', handleDocumentClick);\n document.removeEventListener('keydown', handleDocumentKeyDown);\n };\n }, [isOpen]);\n\n return (\n <div\n ref={dropdownRef}\n className={classes}\n {...props}\n >\n {resolvedTrigger}\n\n {isOpen && (\n <div\n className=\"dropdown__menu\"\n role=\"menu\"\n aria-label={label}\n >\n {options.map((option) => {\n const isSelected =\n option.value === selectedValue;\n\n const itemClasses = classnames('dropdown__item', {\n 'dropdown__item--selected': isSelected,\n 'dropdown__item--disabled': option.disabled,\n });\n\n return (\n <button\n key={option.value}\n className={itemClasses}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={isSelected}\n aria-disabled={option.disabled}\n disabled={option.disabled}\n onClick={() => handleOptionClick(option)}\n >\n {option.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nexport default Dropdown;"]}
1
+ {"version":3,"sources":["../../../src/components/dropdown/dropdown.tsx"],"names":[],"mappings":"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","file":"dropdown.js","sourcesContent":["import React, {\n cloneElement,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport './dropdown.css';\nimport { classnames } from '../helpers/classnames';\n\nexport interface DropdownOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport type DropdownInteraction =\n | 'click'\n | 'hover';\n\ntype DropdownTriggerProps = {\n className?: string;\n onClick?: (\n event: React.MouseEvent,\n ) => void;\n 'aria-haspopup'?: string;\n 'aria-expanded'?: boolean;\n};\n\ntype DropdownTriggerElement =\n React.ReactElement<DropdownTriggerProps>;\n\nexport interface DropdownProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange'\n > {\n options: DropdownOption[];\n value?: string;\n defaultValue?: string;\n label?: string;\n align?:\n | 'top-start'\n | 'top-end'\n | 'bottom-start'\n | 'bottom-end';\n interaction?: DropdownInteraction;\n trigger: DropdownTriggerElement;\n onChange?: (\n value: string,\n ) => void;\n}\n\nconst Dropdown: React.FC<DropdownProps> = ({\n options,\n value,\n defaultValue,\n label = 'Dropdown',\n align = 'bottom-start',\n interaction = 'click',\n trigger,\n onChange,\n className = '',\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n ...props\n}) => {\n const dropdownRef =\n useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] =\n useState(false);\n\n const [\n internalValue,\n setInternalValue,\n ] = useState(defaultValue);\n\n const selectedValue =\n value ?? internalValue;\n\n const isHoverInteraction =\n interaction === 'hover';\n\n const classes = classnames(\n 'dropdown',\n className,\n {\n 'dropdown--open': isOpen,\n 'dropdown--top-start':\n align === 'top-start',\n 'dropdown--top-end':\n align === 'top-end',\n 'dropdown--bottom-start':\n align === 'bottom-start',\n 'dropdown--bottom-end':\n align === 'bottom-end',\n },\n );\n\n const triggerElement =\n trigger as DropdownTriggerElement;\n\n const triggerClasses = classnames(\n 'dropdown__trigger',\n triggerElement.props.className,\n );\n\n const resolvedTrigger = cloneElement(\n triggerElement,\n {\n className: triggerClasses,\n 'aria-haspopup': 'menu',\n 'aria-expanded': isOpen,\n\n onClick: (\n event: React.MouseEvent,\n ) => {\n triggerElement.props.onClick?.(\n event,\n );\n\n if (isHoverInteraction) {\n return;\n }\n\n setIsOpen(\n (currentValue) =>\n !currentValue,\n );\n },\n },\n );\n\n const handleOptionClick = (\n option: DropdownOption,\n ) => {\n if (option.disabled) {\n return;\n }\n\n if (value === undefined) {\n setInternalValue(option.value);\n }\n\n onChange?.(option.value);\n setIsOpen(false);\n };\n\n const handleMouseEnter = (\n event: React.MouseEvent<HTMLDivElement>,\n ) => {\n onMouseEnter?.(event);\n\n if (isHoverInteraction) {\n setIsOpen(true);\n }\n };\n\n const handleMouseLeave = (\n event: React.MouseEvent<HTMLDivElement>,\n ) => {\n onMouseLeave?.(event);\n\n if (isHoverInteraction) {\n setIsOpen(false);\n }\n };\n\n const handleFocus = (\n event: React.FocusEvent<HTMLDivElement>,\n ) => {\n onFocus?.(event);\n\n if (isHoverInteraction) {\n setIsOpen(true);\n }\n };\n\n const handleBlur = (\n event: React.FocusEvent<HTMLDivElement>,\n ) => {\n onBlur?.(event);\n\n if (!isHoverInteraction) {\n return;\n }\n\n const nextTarget =\n event.relatedTarget;\n\n if (\n nextTarget instanceof Node &&\n event.currentTarget.contains(\n nextTarget,\n )\n ) {\n return;\n }\n\n setIsOpen(false);\n };\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handleDocumentClick = (\n event: MouseEvent,\n ) => {\n const dropdown =\n dropdownRef.current;\n\n if (\n !dropdown ||\n dropdown.contains(\n event.target as Node,\n )\n ) {\n return;\n }\n\n setIsOpen(false);\n };\n\n const handleDocumentKeyDown = (\n event: KeyboardEvent,\n ) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener(\n 'mousedown',\n handleDocumentClick,\n );\n\n document.addEventListener(\n 'keydown',\n handleDocumentKeyDown,\n );\n\n return () => {\n document.removeEventListener(\n 'mousedown',\n handleDocumentClick,\n );\n\n document.removeEventListener(\n 'keydown',\n handleDocumentKeyDown,\n );\n };\n }, [isOpen]);\n\n return (\n <div\n ref={dropdownRef}\n className={classes}\n onMouseEnter={\n handleMouseEnter\n }\n onMouseLeave={\n handleMouseLeave\n }\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...props}\n >\n {resolvedTrigger}\n\n {isOpen && (\n <div\n className=\"dropdown__menu\"\n role=\"menu\"\n aria-label={label}\n >\n {options.map((option) => {\n const isSelected =\n option.value ===\n selectedValue;\n\n const itemClasses =\n classnames(\n 'dropdown__item',\n {\n 'dropdown__item--selected':\n isSelected,\n 'dropdown__item--disabled':\n option.disabled,\n },\n );\n\n return (\n <button\n key={option.value}\n className={\n itemClasses\n }\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={\n isSelected\n }\n aria-disabled={\n option.disabled\n }\n disabled={\n option.disabled\n }\n onClick={() =>\n handleOptionClick(\n option,\n )\n }\n >\n {option.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nexport default Dropdown;\n"]}
@@ -4,10 +4,12 @@ var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
5
  require('./flip-list.css');
6
6
  var classnames = require('../helpers/classnames');
7
+ var Tag = require('../tag');
7
8
 
8
9
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
10
 
10
11
  var React__default = /*#__PURE__*/_interopDefault(React);
12
+ var Tag__default = /*#__PURE__*/_interopDefault(Tag);
11
13
 
12
14
  function hasContent(value) {
13
15
  return value !== null && value !== void 0;
@@ -111,6 +113,7 @@ const FlipList = ({
111
113
  ref: item.id === initialOpenItemIdRef.current ? initialOpenItemRef : void 0,
112
114
  className: itemClasses,
113
115
  children: [
116
+ hasStatus && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flip-list__status", children: /* @__PURE__ */ jsxRuntime.jsx(Tag__default.default, { children: item.status }) }),
114
117
  /* @__PURE__ */ jsxRuntime.jsxs(
115
118
  "button",
116
119
  {
@@ -121,11 +124,8 @@ const FlipList = ({
121
124
  "aria-controls": contentId,
122
125
  onClick: () => toggleItem(item.id),
123
126
  children: [
124
- hasStatus && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flip-list__status", children: item.status }),
125
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flip-list__main", children: [
126
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flip-list__title", children: item.title }),
127
- hasMeta && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flip-list__meta", children: item.meta })
128
- ] })
127
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flip-list__title", children: item.title }),
128
+ hasMeta && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flip-list__meta", children: item.meta })
129
129
  ]
130
130
  }
131
131
  ),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/flip-list/flip-list.tsx"],"names":["React","classnames","jsx","jsxs"],"mappings":";;;;;;;;;;;AAoEA,SAAS,WACP,KAAA,EAIA;AACA,EAAA,OAAO,KAAA,KAAU,QAAQ,KAAA,KAAU,MAAA;AACrC;AAEA,SAAS,mBAAA,CACP,OACA,MAAA,EACY;AACZ,EAAA,IACE,MAAA,KAAW,IAAA,IACX,MAAA,KAAW,MAAA,EACX;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,kBAAkB,KAAA,CAAM,IAAA;AAAA,IAC5B,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO;AAAA,GACxB;AAEA,EAAA,OAAO,kBACH,MAAA,GACA,IAAA;AACN;AAEA,MAAM,WAAoC,CAAC;AAAA,EACzC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA,GAAsB,KAAA;AAAA,EACtB,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,WAAA,GAAcA,uBAAM,KAAA,EAAM;AAEhC,EAAA,MAAM,eACJ,MAAA,KAAW,MAAA;AAEb,EAAA,MAAM,uBACJA,sBAAA,CAAM,MAAA;AAAA,IACJ,mBAAA;AAAA,MACE,KAAA;AAAA,MACA,eACI,MAAA,GACA;AAAA;AACN,GACF;AAEF,EAAA,MAAM,wBAAA,GACJA,sBAAA,CAAM,MAAA,CAAO,mBAAmB,CAAA;AAElC,EAAA,MAAM,qBACJA,sBAAA,CAAM,MAAA;AAAA,IACJ;AAAA,GACF;AAEF,EAAA,MAAM,uBAAA,GACJA,sBAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAEpB,EAAA,MAAM;AAAA,IACJ,sBAAA;AAAA,IACA;AAAA,MACEA,sBAAA,CAAM,QAAA;AAAA,IAAqB,MAC7B,mBAAA;AAAA,MACE,KAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,kBAAA,GACJ,mBAAA;AAAA,IACE,KAAA;AAAA,IACA,eACI,MAAA,GACA;AAAA,GACN;AAEF,EAAAA,sBAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IACE,uBAAA,CAAwB,OAAA,IACxB,CAAC,wBAAA,CAAyB,OAAA,IAC1B,qBAAqB,OAAA,KAAY,IAAA,IACjC,CAAC,kBAAA,CAAmB,OAAA,EACpB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,uBAAA,CAAwB,OAAA,GAAU,IAAA;AAElC,IAAA,kBAAA,CAAmB,QAAQ,cAAA,CAAe;AAAA,MACxC,QAAA,EAAU,MAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAUC,qBAAA;AAAA,IACd,WAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,UAAA,GAAa,CACjB,MAAA,KACG;AACH,IAAA,MAAM,cAAA,GACJ,kBAAA,KAAuB,MAAA,GACnB,IAAA,GACA,MAAA;AAEN,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,yBAAA;AAAA,QACE;AAAA,OACF;AAAA,IACF;AAEA,IAAA,YAAA,GAAe,cAAc,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,OAAA;AAAA,MACV,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAA,cAAA,CAAC,SAAI,SAAA,EAAU,kBAAA,EACZ,gBAAM,GAAA,CAAI,CAAC,MAAM,SAAA,KAAc;AAC9B,QAAA,MAAM,MAAA,GACJ,uBAAuB,IAAA,CAAK,EAAA;AAE9B,QAAA,MAAM,SAAA,GAAY,UAAA;AAAA,UAChB,IAAA,CAAK;AAAA,SACP;AAEA,QAAA,MAAM,OAAA,GAAU,UAAA;AAAA,UACd,IAAA,CAAK;AAAA,SACP;AAEA,QAAA,MAAM,SAAA,GACJ,CAAA,EAAG,WAAW,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA;AAErC,QAAA,MAAM,SAAA,GACJ,CAAA,EAAG,WAAW,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA;AAErC,QAAA,MAAM,WAAA,GAAcD,qBAAA;AAAA,UAClB,iBAAA;AAAA,UACA,EAAA;AAAA,UACA;AAAA,YACE,uBAAA,EACE;AAAA;AACJ,SACF;AAEA,QAAA,uBACEE,eAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,GAAA,EACE,IAAA,CAAK,EAAA,KACL,oBAAA,CAAqB,UACjB,kBAAA,GACA,MAAA;AAAA,YAEN,SAAA,EAAW,WAAA;AAAA,YAEX,QAAA,EAAA;AAAA,8BAAAA,eAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,oBAAA;AAAA,kBACV,EAAA,EAAI,SAAA;AAAA,kBACJ,IAAA,EAAK,QAAA;AAAA,kBACL,eAAA,EAAe,MAAA;AAAA,kBACf,eAAA,EAAe,SAAA;AAAA,kBACf,OAAA,EAAS,MACP,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,kBAGnB,QAAA,EAAA;AAAA,oBAAA,SAAA,oBACCD,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EACb,eAAK,MAAA,EACR,CAAA;AAAA,oCAGFC,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EACd,QAAA,EAAA;AAAA,sCAAAD,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA,IAAA,CAAK,KAAA,EACR,CAAA;AAAA,sBAEC,2BACCA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EACb,eAAK,IAAA,EACR;AAAA,qBAAA,EAEJ;AAAA;AAAA;AAAA,eACF;AAAA,8BAEAA,cAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,oBAAA;AAAA,kBACV,EAAA,EAAI,SAAA;AAAA,kBACJ,iBAAA,EAAiB,SAAA;AAAA,kBACjB,QAAQ,CAAC,MAAA;AAAA,kBAER,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACR;AAAA,WAAA;AAAA,UA7CK,IAAA,CAAK;AAAA,SA8CZ;AAAA,MAEJ,CAAC,CAAA,EACH;AAAA;AAAA,GACF;AAEJ,CAAA;AAEA,IAAO,iBAAA,GAAQ","file":"flip-list.cjs","sourcesContent":["import React from 'react';\n\nimport './flip-list.css';\nimport { classnames } from '../helpers/classnames';\n\nexport interface FlipListItem {\n id: React.Key;\n title: React.ReactNode;\n status?: React.ReactNode;\n meta?: React.ReactNode;\n content: React.ReactNode;\n}\n\nexport interface FlipListProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n > {\n items: FlipListItem[];\n\n /**\n * Currently opened item in controlled mode.\n *\n * `null` means that all items are closed.\n *\n * When this prop is provided, FlipList does not\n * own the opened-item state.\n */\n openId?: React.Key | null;\n\n /**\n * Item opened during the initial render\n * in uncontrolled mode.\n *\n * Later changes to this prop do not control\n * the component state.\n */\n defaultOpenId?: React.Key;\n\n /**\n * Called when the user requests a change\n * of the opened item.\n *\n * Receives the item id when an item is opened,\n * and `null` when the currently opened item\n * is closed.\n */\n onOpenChange?: (\n id: React.Key | null,\n ) => void;\n\n /**\n * Scrolls the item that is open during\n * the initial render into view once.\n *\n * In uncontrolled mode, the initial item comes\n * from `defaultOpenId`.\n *\n * In controlled mode, the initial item comes\n * from `openId`.\n *\n * Later state changes never trigger scrolling.\n */\n scrollToInitialOpen?: boolean;\n}\n\ntype OpenItemId = React.Key | null;\n\nfunction hasContent(\n value: React.ReactNode,\n): value is Exclude<\n React.ReactNode,\n null | undefined\n> {\n return value !== null && value !== undefined;\n}\n\nfunction normalizeOpenItemId(\n items: FlipListItem[],\n openId: OpenItemId | undefined,\n): OpenItemId {\n if (\n openId === null ||\n openId === undefined\n ) {\n return null;\n }\n\n const hasMatchingItem = items.some(\n (item) => item.id === openId,\n );\n\n return hasMatchingItem\n ? openId\n : null;\n}\n\nconst FlipList: React.FC<FlipListProps> = ({\n items,\n openId,\n defaultOpenId,\n onOpenChange,\n scrollToInitialOpen = false,\n className = '',\n ...props\n}) => {\n const componentId = React.useId();\n\n const isControlled =\n openId !== undefined;\n\n const initialOpenItemIdRef =\n React.useRef<OpenItemId>(\n normalizeOpenItemId(\n items,\n isControlled\n ? openId\n : defaultOpenId,\n ),\n );\n\n const shouldScrollInitiallyRef =\n React.useRef(scrollToInitialOpen);\n\n const initialOpenItemRef =\n React.useRef<HTMLDivElement | null>(\n null,\n );\n\n const hasScrolledInitiallyRef =\n React.useRef(false);\n\n const [\n uncontrolledOpenItemId,\n setUncontrolledOpenItemId,\n ] = React.useState<OpenItemId>(() =>\n normalizeOpenItemId(\n items,\n defaultOpenId,\n ),\n );\n\n const resolvedOpenItemId =\n normalizeOpenItemId(\n items,\n isControlled\n ? openId\n : uncontrolledOpenItemId,\n );\n\n React.useEffect(() => {\n if (\n hasScrolledInitiallyRef.current ||\n !shouldScrollInitiallyRef.current ||\n initialOpenItemIdRef.current === null ||\n !initialOpenItemRef.current\n ) {\n return;\n }\n\n hasScrolledInitiallyRef.current = true;\n\n initialOpenItemRef.current.scrollIntoView({\n behavior: 'auto',\n block: 'start',\n });\n }, []);\n\n if (items.length === 0) {\n return null;\n }\n\n const classes = classnames(\n 'flip-list',\n className,\n {},\n );\n\n const toggleItem = (\n itemId: React.Key,\n ) => {\n const nextOpenItemId =\n resolvedOpenItemId === itemId\n ? null\n : itemId;\n\n if (!isControlled) {\n setUncontrolledOpenItemId(\n nextOpenItemId,\n );\n }\n\n onOpenChange?.(nextOpenItemId);\n };\n\n return (\n <div\n className={classes}\n {...props}\n >\n <div className=\"flip-list__items\">\n {items.map((item, itemIndex) => {\n const isOpen =\n resolvedOpenItemId === item.id;\n\n const hasStatus = hasContent(\n item.status,\n );\n\n const hasMeta = hasContent(\n item.meta,\n );\n\n const triggerId =\n `${componentId}-trigger-${itemIndex}`;\n\n const contentId =\n `${componentId}-content-${itemIndex}`;\n\n const itemClasses = classnames(\n 'flip-list__item',\n '',\n {\n 'flip-list__item--open':\n isOpen,\n },\n );\n\n return (\n <div\n key={item.id}\n ref={\n item.id ===\n initialOpenItemIdRef.current\n ? initialOpenItemRef\n : undefined\n }\n className={itemClasses}\n >\n <button\n className=\"flip-list__trigger\"\n id={triggerId}\n type=\"button\"\n aria-expanded={isOpen}\n aria-controls={contentId}\n onClick={() =>\n toggleItem(item.id)\n }\n >\n {hasStatus && (\n <span className=\"flip-list__status\">\n {item.status}\n </span>\n )}\n\n <span className=\"flip-list__main\">\n <span className=\"flip-list__title\">\n {item.title}\n </span>\n\n {hasMeta && (\n <span className=\"flip-list__meta\">\n {item.meta}\n </span>\n )}\n </span>\n </button>\n\n <div\n className=\"flip-list__content\"\n id={contentId}\n aria-labelledby={triggerId}\n hidden={!isOpen}\n >\n {item.content}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default FlipList;\n"]}
1
+ {"version":3,"sources":["../../../src/components/flip-list/flip-list.tsx"],"names":["React","classnames","jsx","jsxs","Tag"],"mappings":"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","file":"flip-list.cjs","sourcesContent":["import React from 'react';\n\nimport './flip-list.css';\nimport { classnames } from '../helpers/classnames';\nimport Tag from '../tag';\n\nexport interface FlipListItem {\n id: React.Key;\n title: React.ReactNode;\n status?: React.ReactNode;\n meta?: React.ReactNode;\n content: React.ReactNode;\n}\n\nexport interface FlipListProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n > {\n items: FlipListItem[];\n\n /**\n * Currently opened item in controlled mode.\n *\n * `null` means that all items are closed.\n *\n * When this prop is provided, FlipList does not\n * own the opened-item state.\n */\n openId?: React.Key | null;\n\n /**\n * Item opened during the initial render\n * in uncontrolled mode.\n *\n * Later changes to this prop do not control\n * the component state.\n */\n defaultOpenId?: React.Key;\n\n /**\n * Called when the user requests a change\n * of the opened item.\n *\n * Receives the item id when an item is opened,\n * and `null` when the currently opened item\n * is closed.\n */\n onOpenChange?: (\n id: React.Key | null,\n ) => void;\n\n /**\n * Scrolls the item that is open during\n * the initial render into view once.\n *\n * In uncontrolled mode, the initial item comes\n * from `defaultOpenId`.\n *\n * In controlled mode, the initial item comes\n * from `openId`.\n *\n * Later state changes never trigger scrolling.\n */\n scrollToInitialOpen?: boolean;\n}\n\ntype OpenItemId = React.Key | null;\n\nfunction hasContent(\n value: React.ReactNode,\n): value is Exclude<\n React.ReactNode,\n null | undefined\n> {\n return value !== null && value !== undefined;\n}\n\nfunction normalizeOpenItemId(\n items: FlipListItem[],\n openId: OpenItemId | undefined,\n): OpenItemId {\n if (\n openId === null ||\n openId === undefined\n ) {\n return null;\n }\n\n const hasMatchingItem = items.some(\n (item) => item.id === openId,\n );\n\n return hasMatchingItem\n ? openId\n : null;\n}\n\nconst FlipList: React.FC<FlipListProps> = ({\n items,\n openId,\n defaultOpenId,\n onOpenChange,\n scrollToInitialOpen = false,\n className = '',\n ...props\n}) => {\n const componentId = React.useId();\n\n const isControlled =\n openId !== undefined;\n\n const initialOpenItemIdRef =\n React.useRef<OpenItemId>(\n normalizeOpenItemId(\n items,\n isControlled\n ? openId\n : defaultOpenId,\n ),\n );\n\n const shouldScrollInitiallyRef =\n React.useRef(scrollToInitialOpen);\n\n const initialOpenItemRef =\n React.useRef<HTMLDivElement | null>(\n null,\n );\n\n const hasScrolledInitiallyRef =\n React.useRef(false);\n\n const [\n uncontrolledOpenItemId,\n setUncontrolledOpenItemId,\n ] = React.useState<OpenItemId>(() =>\n normalizeOpenItemId(\n items,\n defaultOpenId,\n ),\n );\n\n const resolvedOpenItemId =\n normalizeOpenItemId(\n items,\n isControlled\n ? openId\n : uncontrolledOpenItemId,\n );\n\n React.useEffect(() => {\n if (\n hasScrolledInitiallyRef.current ||\n !shouldScrollInitiallyRef.current ||\n initialOpenItemIdRef.current === null ||\n !initialOpenItemRef.current\n ) {\n return;\n }\n\n hasScrolledInitiallyRef.current = true;\n\n initialOpenItemRef.current.scrollIntoView({\n behavior: 'auto',\n block: 'start',\n });\n }, []);\n\n if (items.length === 0) {\n return null;\n }\n\n const classes = classnames(\n 'flip-list',\n className,\n {},\n );\n\n const toggleItem = (\n itemId: React.Key,\n ) => {\n const nextOpenItemId =\n resolvedOpenItemId === itemId\n ? null\n : itemId;\n\n if (!isControlled) {\n setUncontrolledOpenItemId(\n nextOpenItemId,\n );\n }\n\n onOpenChange?.(nextOpenItemId);\n };\n\n return (\n <div\n className={classes}\n {...props}\n >\n <div className=\"flip-list__items\">\n {items.map((item, itemIndex) => {\n const isOpen =\n resolvedOpenItemId === item.id;\n\n const hasStatus = hasContent(\n item.status,\n );\n\n const hasMeta = hasContent(\n item.meta,\n );\n\n const triggerId =\n `${componentId}-trigger-${itemIndex}`;\n\n const contentId =\n `${componentId}-content-${itemIndex}`;\n\n const itemClasses = classnames(\n 'flip-list__item',\n '',\n {\n 'flip-list__item--open':\n isOpen,\n },\n );\n\n return (\n <div\n key={item.id}\n ref={\n item.id ===\n initialOpenItemIdRef.current\n ? initialOpenItemRef\n : undefined\n }\n className={itemClasses}\n >\n {hasStatus && (\n <div className=\"flip-list__status\">\n <Tag>\n {item.status}\n </Tag>\n </div>\n )}\n\n <button\n className=\"flip-list__trigger\"\n id={triggerId}\n type=\"button\"\n aria-expanded={isOpen}\n aria-controls={contentId}\n onClick={() =>\n toggleItem(item.id)\n }\n >\n <span className=\"flip-list__title\">\n {item.title}\n </span>\n\n {hasMeta && (\n <span className=\"flip-list__meta\">\n {item.meta}\n </span>\n )}\n </button>\n\n <div\n className=\"flip-list__content\"\n id={contentId}\n aria-labelledby={triggerId}\n hidden={!isOpen}\n >\n {item.content}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default FlipList;\n"]}
@@ -113,7 +113,6 @@
113
113
  /* typography */
114
114
 
115
115
  /* size */
116
- gap: var(--flip-list-open-content-gap);
117
116
 
118
117
  /* border */
119
118
 
@@ -133,8 +132,9 @@
133
132
 
134
133
  /* size */
135
134
  display: flex;
136
- flex-direction: column;
137
- align-items: stretch;
135
+ align-items: center;
136
+ justify-content: space-between;
137
+ gap: var(--flip-list-trigger-column-gap);
138
138
  width: 100%;
139
139
  min-width: 0;
140
140
  max-width: 100%;
@@ -195,27 +195,6 @@
195
195
  /* motion */
196
196
  }
197
197
 
198
- .flip-list__main {
199
- /* color */
200
-
201
- /* typography */
202
-
203
- /* size */
204
- display: flex;
205
- align-items: flex-start;
206
- justify-content: space-between;
207
- gap: var(--flip-list-trigger-column-gap);
208
- width: 100%;
209
- min-width: 0;
210
- max-width: 100%;
211
-
212
- /* border */
213
-
214
- /* depth */
215
-
216
- /* motion */
217
- }
218
-
219
198
  .flip-list__title {
220
199
  /* color */
221
200
  color: inherit;
@@ -384,6 +363,23 @@
384
363
  /* motion */
385
364
  }
386
365
 
366
+ .flip-list__item--open
367
+ .flip-list__content {
368
+ /* color */
369
+
370
+ /* typography */
371
+
372
+ /* size */
373
+ margin-top:
374
+ var(--flip-list-open-content-gap);
375
+
376
+ /* border */
377
+
378
+ /* depth */
379
+
380
+ /* motion */
381
+ }
382
+
387
383
  .flip-list__content[hidden] {
388
384
  /* color */
389
385
 
@@ -2,6 +2,7 @@ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import React from 'react';
3
3
  import './flip-list.css';
4
4
  import { classnames } from '../helpers/classnames';
5
+ import Tag from '../tag';
5
6
 
6
7
  function hasContent(value) {
7
8
  return value !== null && value !== void 0;
@@ -105,6 +106,7 @@ const FlipList = ({
105
106
  ref: item.id === initialOpenItemIdRef.current ? initialOpenItemRef : void 0,
106
107
  className: itemClasses,
107
108
  children: [
109
+ hasStatus && /* @__PURE__ */ jsx("div", { className: "flip-list__status", children: /* @__PURE__ */ jsx(Tag, { children: item.status }) }),
108
110
  /* @__PURE__ */ jsxs(
109
111
  "button",
110
112
  {
@@ -115,11 +117,8 @@ const FlipList = ({
115
117
  "aria-controls": contentId,
116
118
  onClick: () => toggleItem(item.id),
117
119
  children: [
118
- hasStatus && /* @__PURE__ */ jsx("span", { className: "flip-list__status", children: item.status }),
119
- /* @__PURE__ */ jsxs("span", { className: "flip-list__main", children: [
120
- /* @__PURE__ */ jsx("span", { className: "flip-list__title", children: item.title }),
121
- hasMeta && /* @__PURE__ */ jsx("span", { className: "flip-list__meta", children: item.meta })
122
- ] })
120
+ /* @__PURE__ */ jsx("span", { className: "flip-list__title", children: item.title }),
121
+ hasMeta && /* @__PURE__ */ jsx("span", { className: "flip-list__meta", children: item.meta })
123
122
  ]
124
123
  }
125
124
  ),