native-document 1.0.139 → 1.0.140

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 (259) hide show
  1. package/components.js +1 -1
  2. package/devtools/ComponentRegistry.js +3 -2
  3. package/dist/native-document.components.min.css +1 -0
  4. package/dist/native-document.components.min.js +11618 -8748
  5. package/dist/native-document.dev.js +2645 -2166
  6. package/dist/native-document.dev.js.map +1 -1
  7. package/dist/native-document.min.js +1 -1
  8. package/index.js +1 -0
  9. package/package.json +5 -2
  10. package/rollup.config.js +5 -2
  11. package/src/components/$traits/has-draggable/HasDraggable.js +69 -0
  12. package/src/components/$traits/has-draggable/has-draggable.css +8 -0
  13. package/src/components/$traits/{HasItems.js → has-items/HasItems.js} +2 -11
  14. package/src/components/$traits/has-position/HasFullPosition.js +51 -0
  15. package/src/components/$traits/has-position/HasPosition.js +23 -0
  16. package/src/components/$traits/has-resizable/HasResizable.js +113 -0
  17. package/src/components/$traits/has-resizable/has-resizable.css +121 -0
  18. package/src/components/$traits/has-validation/HasValidation.js +86 -0
  19. package/src/components/BaseComponent.js +82 -7
  20. package/src/components/accordion/Accordion.js +37 -31
  21. package/src/components/accordion/AccordionItem.js +14 -21
  22. package/src/components/alert/Alert.js +48 -40
  23. package/src/components/avatar/Avatar.js +4 -3
  24. package/src/components/avatar/AvatarGroup.js +8 -2
  25. package/src/components/badge/Badge.js +7 -7
  26. package/src/components/base-component.css +0 -0
  27. package/src/components/breadcrumb/BreadCrumb.js +30 -21
  28. package/src/components/button/Button.js +3 -14
  29. package/src/components/context-menu/ContextMenu.js +49 -26
  30. package/src/components/dropdown/Dropdown.js +172 -34
  31. package/src/components/dropdown/DropdownDivider.js +4 -3
  32. package/src/components/dropdown/DropdownGroup.js +19 -19
  33. package/src/components/dropdown/DropdownItem.js +24 -18
  34. package/src/components/dropdown/helpers.js +52 -0
  35. package/src/components/form/FormControl.js +207 -108
  36. package/src/components/form/field/Field.js +106 -174
  37. package/src/components/form/field/FieldCollection.js +110 -203
  38. package/src/components/form/field/types/AutocompleteField.js +26 -5
  39. package/src/components/form/field/types/CheckboxField.js +4 -4
  40. package/src/components/form/field/types/CheckboxGroupField.js +11 -5
  41. package/src/components/form/field/types/ColorField.js +4 -4
  42. package/src/components/form/field/types/DateField.js +110 -18
  43. package/src/components/form/field/types/EmailField.js +2 -2
  44. package/src/components/form/field/types/FileField.js +87 -21
  45. package/src/components/form/field/types/HiddenField.js +4 -4
  46. package/src/components/form/field/types/ImageField.js +4 -4
  47. package/src/components/form/field/types/NumberField.js +5 -5
  48. package/src/components/form/field/types/PasswordField.js +28 -6
  49. package/src/components/form/field/types/RadioField.js +12 -8
  50. package/src/components/form/field/types/RangeField.js +29 -5
  51. package/src/components/form/field/types/SearchField.js +4 -4
  52. package/src/components/form/field/types/SelectField.js +75 -8
  53. package/src/components/form/field/types/StringField.js +4 -4
  54. package/src/components/form/field/types/TelField.js +4 -4
  55. package/src/components/form/field/types/TextAreaField.js +7 -5
  56. package/src/components/form/field/types/TimeField.js +52 -6
  57. package/src/components/form/field/types/UrlField.js +4 -5
  58. package/src/components/form/field/types/file-field-mode/FileAvatarMode.js +104 -0
  59. package/src/components/form/field/types/file-field-mode/FileDropzoneMode.js +59 -0
  60. package/src/components/form/field/types/file-field-mode/FileItemPreview.js +74 -0
  61. package/src/components/form/field/types/file-field-mode/FileNativeMode.js +21 -0
  62. package/src/components/form/field/types/file-field-mode/FileUploadButtonMode.js +59 -0
  63. package/src/components/form/field/types/file-field-mode/FileWallMode.js +53 -0
  64. package/src/components/form/index.js +14 -2
  65. package/src/components/form/validation/Validation.js +9 -0
  66. package/src/components/list/List.js +1 -1
  67. package/src/components/list/ListGroup.js +1 -1
  68. package/src/components/menu/HasMenuItem.js +133 -0
  69. package/src/components/menu/Menu.js +47 -56
  70. package/src/components/menu/MenuGroup.js +36 -8
  71. package/src/components/menu/MenuItem.js +24 -10
  72. package/src/components/menu/MenuLink.js +2 -0
  73. package/src/components/modal/Modal.js +153 -23
  74. package/src/components/pagination/Pagination.js +55 -21
  75. package/src/components/popover/Popover.js +127 -40
  76. package/src/components/progress/Progress.js +14 -24
  77. package/src/components/skeleton/Skeleton.js +36 -13
  78. package/src/components/slider/Slider.js +96 -70
  79. package/src/components/spinner/Spinner.js +4 -2
  80. package/src/components/splitter/Splitter.js +15 -8
  81. package/src/components/splitter/SplitterGutter.js +28 -7
  82. package/src/components/splitter/SplitterPanel.js +9 -15
  83. package/src/components/splitter/index.js +3 -1
  84. package/src/components/stacks/AbsoluteStack.js +33 -0
  85. package/src/components/stacks/FixedStack.js +33 -0
  86. package/src/components/stacks/PositionStack.js +146 -0
  87. package/src/components/stacks/RelativeStack.js +33 -0
  88. package/src/components/{layouts → stacks}/Stack.js +22 -3
  89. package/src/components/{layouts → stacks}/index.js +6 -4
  90. package/src/components/stepper/Stepper.js +159 -67
  91. package/src/components/stepper/StepperStep.js +49 -12
  92. package/src/components/switch/Switch.js +59 -29
  93. package/src/components/switch/index.js +6 -0
  94. package/src/components/table/Column.js +22 -26
  95. package/src/components/table/ColumnGroup.js +4 -13
  96. package/src/components/table/DataTable.js +388 -103
  97. package/src/components/table/SimpleTable.js +28 -143
  98. package/src/components/tabs/Tabs.js +142 -44
  99. package/src/components/toast/Toast.js +40 -35
  100. package/src/components/tooltip/Tooltip.js +152 -35
  101. package/src/core/data/ObservableArray.js +94 -30
  102. package/src/core/data/ObservableChecker.js +20 -75
  103. package/src/core/data/ObservableItem.js +35 -3
  104. package/src/core/data/observable-helpers/computed.js +2 -1
  105. package/src/core/data/observable-helpers/object.js +13 -8
  106. package/src/core/data/observable-helpers/observable.is-to.js +196 -0
  107. package/src/core/elements/anchor/anchor.js +3 -2
  108. package/src/core/elements/control/for-each-array.js +44 -30
  109. package/src/core/elements/control/for-each.js +6 -3
  110. package/src/core/elements/control/show-if.js +11 -6
  111. package/src/core/elements/control/switch.js +2 -1
  112. package/src/core/elements/index.js +1 -1
  113. package/src/core/elements/svg.js +61 -0
  114. package/src/core/utils/HasEventEmitter.js +6 -0
  115. package/src/core/utils/debug-manager.js +2 -5
  116. package/src/core/utils/filters/standard.js +2 -1
  117. package/src/core/utils/property-accumulator.js +35 -6
  118. package/src/core/utils/shortcut-manager.js +242 -0
  119. package/src/core/utils/validator.js +1 -1
  120. package/src/core/wrappers/AttributesWrapper.js +41 -4
  121. package/src/core/wrappers/DocumentObserver.js +0 -1
  122. package/src/core/wrappers/HtmlElementWrapper.js +1 -1
  123. package/src/core/wrappers/NDElement.js +15 -2
  124. package/src/core/wrappers/SvgElementWrapper.js +15 -0
  125. package/src/core/wrappers/prototypes/attributes-extensions.js +4 -1
  126. package/src/core/wrappers/prototypes/nd-element-extensions.js +8 -1
  127. package/src/router/Router.js +0 -1
  128. package/src/ui/components/accordion/AccordionItemRender.js +63 -0
  129. package/src/ui/components/accordion/AccordionRender.js +34 -0
  130. package/src/ui/components/accordion/accordion.css +121 -0
  131. package/src/ui/components/alert/AlertRender.js +80 -0
  132. package/src/ui/components/alert/alert.css +163 -0
  133. package/src/ui/components/avatar/avata-group/AvatarGroupRender.js +49 -0
  134. package/src/ui/components/avatar/avata-group/avatar-group.css +38 -0
  135. package/src/ui/components/avatar/avatar/AvatarRender.js +87 -0
  136. package/src/ui/components/avatar/avatar/avatar.css +189 -0
  137. package/src/ui/components/badge/BadgeRender.js +24 -0
  138. package/src/ui/components/badge/badge.css +168 -0
  139. package/src/ui/components/breadcrumb/BreadcrumbRender.js +43 -0
  140. package/src/ui/components/breadcrumb/breadcrumb.css +55 -0
  141. package/src/ui/components/button/ButtonRender.js +65 -0
  142. package/src/ui/components/button/button.css +288 -354
  143. package/src/ui/components/contextmenu/ContextmenuRender.js +70 -0
  144. package/src/ui/components/contextmenu/contextmenu.css +36 -0
  145. package/src/ui/components/divider/DividerRender.js +70 -0
  146. package/src/ui/components/divider/divider.css +70 -0
  147. package/src/ui/components/dropdown/DropdownRender.js +92 -0
  148. package/src/ui/components/dropdown/divider/DropdownDividerRender.js +9 -0
  149. package/src/ui/components/dropdown/divider/dropdown-divider.css +0 -0
  150. package/src/ui/components/dropdown/dropdown.css +179 -0
  151. package/src/ui/components/dropdown/group/DropdownGroupRender.js +23 -0
  152. package/src/ui/components/dropdown/group/dropdown-group.css +0 -0
  153. package/src/ui/components/dropdown/item/DropdownItemRender.js +29 -0
  154. package/src/ui/components/dropdown/item/dropdown-item.css +0 -0
  155. package/src/ui/components/form/FieldCollectionRender.js +110 -0
  156. package/src/ui/components/form/FormControlRender.js +84 -0
  157. package/src/ui/components/form/field-collection.css +55 -0
  158. package/src/ui/components/form/fields/AutocompleteFieldRender.js +143 -0
  159. package/src/ui/components/form/fields/CheckboxFieldRender.js +59 -0
  160. package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +92 -0
  161. package/src/ui/components/form/fields/ColorFieldRender.js +30 -0
  162. package/src/ui/components/form/fields/DateFieldRender.js +154 -0
  163. package/src/ui/components/form/fields/EmailFieldRender.js +5 -0
  164. package/src/ui/components/form/fields/FieldRender.js +117 -0
  165. package/src/ui/components/form/fields/FileFieldRender.js +41 -0
  166. package/src/ui/components/form/fields/HiddenFieldRender.js +14 -0
  167. package/src/ui/components/form/fields/ImageFieldRender.js +0 -0
  168. package/src/ui/components/form/fields/NumberFieldRender.js +52 -0
  169. package/src/ui/components/form/fields/PasswordFieldRender.js +65 -0
  170. package/src/ui/components/form/fields/RadioFieldRender.js +77 -0
  171. package/src/ui/components/form/fields/RangeFieldRender.js +121 -0
  172. package/src/ui/components/form/fields/SelectFieldRender.js +248 -0
  173. package/src/ui/components/form/fields/SliderFieldRender.js +359 -0
  174. package/src/ui/components/form/fields/StringFieldRender.js +6 -0
  175. package/src/ui/components/form/fields/TelFieldRender.js +6 -0
  176. package/src/ui/components/form/fields/TextAreaFieldRender.js +96 -0
  177. package/src/ui/components/form/fields/TimeFieldRender.js +141 -0
  178. package/src/ui/components/form/fields/UrlFieldRender.js +6 -0
  179. package/src/ui/components/form/fields/date-field.css +32 -0
  180. package/src/ui/components/form/fields/field.css +402 -0
  181. package/src/ui/components/form/fields/file-field.css +79 -0
  182. package/src/ui/components/form/fields/password-field.css +50 -0
  183. package/src/ui/components/form/fields/range-field.css +120 -0
  184. package/src/ui/components/form/fields/slider.css +195 -0
  185. package/src/ui/components/form/file-upload-mode/FileAvatarModeRender.js +143 -0
  186. package/src/ui/components/form/file-upload-mode/FileDropzoneModeRender.js +108 -0
  187. package/src/ui/components/form/file-upload-mode/FileNativeModeRender.js +22 -0
  188. package/src/ui/components/form/file-upload-mode/FileUploadButtonModeRender.js +89 -0
  189. package/src/ui/components/form/file-upload-mode/FileWallModeRender.js +91 -0
  190. package/src/ui/components/form/file-upload-mode/file-avatar-mode.css +139 -0
  191. package/src/ui/components/form/file-upload-mode/file-dropzone-mode.css +88 -0
  192. package/src/ui/components/form/file-upload-mode/file-upload-button-mode.css +44 -0
  193. package/src/ui/components/form/file-upload-mode/file-wall-mode.css +88 -0
  194. package/src/ui/components/form/form-control.css +40 -0
  195. package/src/ui/components/form/helpers.js +112 -0
  196. package/src/ui/components/form/index.js +61 -0
  197. package/src/ui/components/menu/MenuDividerRender.js +12 -0
  198. package/src/ui/components/menu/MenuGroupRender.js +60 -0
  199. package/src/ui/components/menu/MenuItemRender.js +57 -0
  200. package/src/ui/components/menu/MenuLinkRender.js +55 -0
  201. package/src/ui/components/menu/MenuRender.js +21 -0
  202. package/src/ui/components/menu/helpers.js +121 -0
  203. package/src/ui/components/menu/menu.css +308 -0
  204. package/src/ui/components/modal/ModalRender.js +119 -0
  205. package/src/ui/components/modal/modal.css +156 -0
  206. package/src/ui/components/pagination/PaginationRender.js +112 -0
  207. package/src/ui/components/pagination/pagination.css +63 -0
  208. package/src/ui/components/popover/PopoverRender.js +234 -0
  209. package/src/ui/components/popover/popover.css +139 -0
  210. package/src/ui/components/progress/ProgressRender.js +168 -0
  211. package/src/ui/components/progress/progress.css +197 -0
  212. package/src/ui/components/skeleton/SkeletonRender.js +79 -0
  213. package/src/ui/components/skeleton/skeleton.css +154 -0
  214. package/src/ui/components/spinner/SpinnerRender.js +46 -0
  215. package/src/ui/components/spinner/spinner.css +152 -0
  216. package/src/ui/components/splitter/SplitterGutterRender.js +94 -0
  217. package/src/ui/components/splitter/SplitterPanelRender.js +38 -0
  218. package/src/ui/components/splitter/SplitterRender.js +74 -0
  219. package/src/ui/components/splitter/splitter.css +128 -0
  220. package/src/ui/components/stacks/PositionStackRender.js +38 -0
  221. package/src/ui/components/stacks/StackRender.js +42 -0
  222. package/src/ui/components/stacks/absolute-stack/AbsoluteStackRender.js +5 -0
  223. package/src/ui/components/stacks/fixed-stack/FixedStackRender.js +5 -0
  224. package/src/ui/components/stacks/h-stack/HStackRender.js +7 -0
  225. package/src/ui/components/stacks/h-stack/h-stack.css +4 -0
  226. package/src/ui/components/stacks/index.js +15 -0
  227. package/src/ui/components/stacks/position-stack.css +62 -0
  228. package/src/ui/components/stacks/relative-stack/RelativeStackRender.js +7 -0
  229. package/src/ui/components/stacks/relative-stack/relative-stack.css +3 -0
  230. package/src/ui/components/stacks/stack.css +78 -0
  231. package/src/ui/components/stacks/v-stack/VStackRender.js +5 -0
  232. package/src/ui/components/stacks/v-stack/v-stack.css +4 -0
  233. package/src/ui/components/stepper/StepperRender.js +70 -0
  234. package/src/ui/components/stepper/StepperStepRender.js +67 -0
  235. package/src/ui/components/stepper/stepper.css +359 -0
  236. package/src/ui/components/switch/SwitchRender.js +82 -0
  237. package/src/ui/components/switch/switch.css +143 -0
  238. package/src/ui/components/table/data-table/DataTableRender.js +49 -0
  239. package/src/ui/components/table/data-table/bulk-actions.js +35 -0
  240. package/src/ui/components/table/data-table/data-table.css +246 -0
  241. package/src/ui/components/table/data-table/pagination.js +56 -0
  242. package/src/ui/components/table/data-table/tables.js +363 -0
  243. package/src/ui/components/table/data-table/toolbar.js +67 -0
  244. package/src/ui/components/table/simple-table/SimpleTableRender.js +188 -0
  245. package/src/ui/components/table/simple-table/simple-table.css +50 -0
  246. package/src/ui/components/tabs/TabsRender.js +226 -0
  247. package/src/ui/components/tabs/tabs.css +253 -0
  248. package/src/ui/components/toast/ToastRender.js +98 -0
  249. package/src/ui/components/toast/toast.css +201 -0
  250. package/src/ui/components/tooltip/TooltipRender.js +8 -0
  251. package/src/ui/components/tooltip/tooltip.css +113 -0
  252. package/src/ui/index.js +82 -0
  253. package/src/ui/tokens/colors-dark.scss +2 -1
  254. package/src/ui/tokens/reset.scss +3 -0
  255. package/types/control-flow.d.ts +2 -2
  256. package/src/components/layouts/ZStack.js +0 -41
  257. package/src/ui/components/button/button.render.js +0 -63
  258. /package/src/components/{layouts → stacks}/HStack.js +0 -0
  259. /package/src/components/{layouts → stacks}/VStack.js +0 -0
@@ -1,362 +1,296 @@
1
- /* ─────────────────────────────────────────────
2
- Button tokens
3
- Dépend de : vars.css (colors, spacings, radius, fonts)
4
- ───────────────────────────────────────────── */
5
1
  :root {
6
- /* Sizes — hauteurs */
7
- --btn-height-sm: 28px;
8
- --btn-height-md: 36px;
9
- --btn-height-lg: 44px;
10
-
11
- /* Sizes — paddings horizontaux */
12
- --btn-padding-sm: var(--space-cozy) var(--space-cozy-comfortable);
13
- --btn-padding-md: var(--space-cozy) var(--space-comfortable);
14
- --btn-padding-lg: var(--space-cozy-comfortable) var(--space-relaxed);
15
-
16
- /* Sizes — font */
17
- --btn-font-size-sm: var(--note-size);
18
- --btn-font-size-md: var(--description-size);
19
- --btn-font-size-lg: var(--text-size);
20
-
21
- /* Sizes — icon */
22
- --btn-icon-size-sm: 14px;
23
- --btn-icon-size-md: 16px;
24
- --btn-icon-size-lg: 18px;
25
-
26
- /* Shape */
27
- --btn-radius: var(--radius-button);
28
- --btn-radius-rounded: var(--radius-x);
29
- --btn-radius-pill: var(--radius-pill);
30
-
31
- /* Misc */
32
- --btn-font-family: var(--font);
33
- --btn-font-weight: 500;
34
- --btn-gap: var(--space-cozy);
35
- --btn-transition: background 120ms ease, color 120ms ease, border-color 120ms ease, opacity 120ms ease;
2
+ --btn-height-small: 28px;
3
+ --btn-height-medium: 36px;
4
+ --btn-height-large: 44px;
5
+
6
+ --btn-padding-small: 0 var(--space-cozy-comfortable);
7
+ --btn-padding-medium: 0 var(--space-comfortable);
8
+ --btn-padding-large: 0 var(--space-relaxed);
9
+
10
+ --btn-font-size-small: var(--note-size);
11
+ --btn-font-size-medium: var(--description-size);
12
+ --btn-font-size-large: var(--text-size);
13
+
14
+ --btn-icon-size-small: 14px;
15
+ --btn-icon-size-medium: 16px;
16
+ --btn-icon-size-large: 18px;
17
+
18
+ --btn-loader-size: 14px;
19
+ --btn-gap: var(--space-cozy);
20
+ --btn-font-weight: 500;
21
+ --btn-transition: background 120ms ease, color 120ms ease, border-color 120ms ease, opacity 120ms ease;
36
22
  --btn-disabled-opacity: 0.45;
37
- --btn-loader-size: 14px;
38
- --btn-border-width: 1px;
39
-
40
- /* ── Variants ── */
41
-
42
- /* Primary */
43
- --btn-primary-bg: var(--color-primary);
44
- --btn-primary-bg-hover: var(--color-primary-hover);
45
- --btn-primary-color: var(--white);
46
- --btn-primary-border: var(--color-primary);
47
- --btn-primary-border-hover: var(--color-primary-hover);
48
-
49
- /* Secondary */
50
- --btn-secondary-bg: var(--color-secondary);
51
- --btn-secondary-bg-hover: var(--color-secondary-hover);
52
- --btn-secondary-color: var(--color-secondary-text);
53
- --btn-secondary-border: var(--color-secondary);
54
- --btn-secondary-border-hover: var(--color-secondary-hover);
55
-
56
- /* Danger */
57
- --btn-danger-bg: var(--color-danger);
58
- --btn-danger-bg-hover: var(--color-danger-hover);
59
- --btn-danger-color: var(--white);
60
- --btn-danger-border: var(--color-danger);
61
- --btn-danger-border-hover: var(--color-danger-hover);
62
-
63
- /* Success */
64
- --btn-success-bg: var(--color-success);
65
- --btn-success-bg-hover: var(--color-success-hover);
66
- --btn-success-color: var(--white);
67
- --btn-success-border: var(--color-success);
68
- --btn-success-border-hover: var(--color-success-hover);
69
-
70
- /* Warning */
71
- --btn-warning-bg: var(--color-warning);
72
- --btn-warning-bg-hover: var(--color-warning-hover);
73
- --btn-warning-color: var(--white);
74
- --btn-warning-border: var(--color-warning);
75
- --btn-warning-border-hover: var(--color-warning-hover);
76
-
77
- /* Info */
78
- --btn-info-bg: var(--color-info);
79
- --btn-info-bg-hover: var(--color-info-hover);
80
- --btn-info-color: var(--white);
81
- --btn-info-border: var(--color-info);
82
- --btn-info-border-hover: var(--color-info-hover);
83
-
84
- /* Ghost */
85
- --btn-ghost-bg: var(--color-ghost);
86
- --btn-ghost-bg-hover: var(--color-ghost-hover);
87
- --btn-ghost-color: var(--color-ghost-text);
88
- --btn-ghost-border: transparent;
89
- --btn-ghost-border-hover: transparent;
90
-
91
- /* Link */
92
- --btn-link-bg: transparent;
93
- --btn-link-bg-hover: transparent;
94
- --btn-link-color: var(--color-link);
95
- --btn-link-color-hover: var(--color-link-hover);
96
- --btn-link-border: transparent;
97
- }
98
-
99
- /* ─────────────────────────────────────────────
100
- Base
101
- ───────────────────────────────────────────── */
102
- .btn {
103
- display: inline-flex;
104
- align-items: center;
105
- justify-content: center;
106
- gap: var(--btn-gap);
107
- border: var(--btn-border-width) solid transparent;
108
- border-radius: var(--btn-radius);
109
- cursor: pointer;
110
- font-family: var(--btn-font-family);
111
- font-weight: var(--btn-font-weight);
112
- font-size: var(--btn-font-size-md);
113
- height: var(--btn-height-md);
114
- padding: var(--btn-padding-md);
115
- line-height: 1;
116
- white-space: nowrap;
117
- text-decoration: none;
118
- outline: none;
119
- transition: var(--btn-transition);
120
- user-select: none;
121
- box-sizing: border-box;
122
- vertical-align: middle;
123
- }
124
23
 
125
- /* ─────────────────────────────────────────────
126
- Sizes
127
- ───────────────────────────────────────────── */
128
- .btn--sm {
129
- height: var(--btn-height-sm);
130
- padding: var(--btn-padding-sm);
131
- font-size: var(--btn-font-size-sm);
132
- }
133
- .btn--lg {
134
- height: var(--btn-height-lg);
135
- padding: var(--btn-padding-lg);
136
- font-size: var(--btn-font-size-lg);
137
- }
138
-
139
- /* ─────────────────────────────────────────────
140
- Shapes
141
- ───────────────────────────────────────────── */
142
- .btn--rounded { border-radius: var(--btn-radius-rounded); }
143
- .btn--pill { border-radius: var(--btn-radius-pill); }
144
- .btn--circle {
145
- border-radius: 50%;
146
- padding: 0;
147
- width: var(--btn-height-md);
148
- }
149
- .btn--sm.btn--circle { width: var(--btn-height-sm); }
150
- .btn--lg.btn--circle { width: var(--btn-height-lg); }
151
-
152
- /* ─────────────────────────────────────────────
153
- Block
154
- ───────────────────────────────────────────── */
155
- .btn--block {
156
- width: 100%;
157
- display: flex;
24
+ --btn-color-primary: var(--color-primary);
25
+ --btn-color-primary-hover: var(--color-primary-hover);
26
+ --btn-color-secondary: var(--color-secondary);
27
+ --btn-color-secondary-hover: var(--color-secondary-hover);
28
+ --btn-color-secondary-text: var(--color-secondary-text);
29
+ --btn-color-danger: var(--color-danger);
30
+ --btn-color-danger-hover: var(--color-danger-hover);
31
+ --btn-color-success: var(--color-success);
32
+ --btn-color-success-hover: var(--color-success-hover);
33
+ --btn-color-warning: var(--color-warning);
34
+ --btn-color-warning-hover: var(--color-warning-hover);
35
+ --btn-color-info: var(--color-info);
36
+ --btn-color-info-hover: var(--color-info-hover);
37
+ --btn-color-ghost-hover: var(--color-ghost-hover);
38
+ --btn-color-ghost-text: var(--color-ghost-text);
39
+ --btn-color-link: var(--color-link);
40
+ --btn-color-link-hover: var(--color-link-hover);
158
41
  }
159
42
 
160
- /* ─────────────────────────────────────────────
161
- Icon
162
- ───────────────────────────────────────────── */
163
- .btn__icon {
164
- display: inline-flex;
43
+ .btn {
44
+ display: inline-flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ gap: var(--btn-gap);
48
+ border: 1px solid transparent;
49
+ border-radius: var(--radius-button);
50
+ cursor: pointer;
51
+ font-family: var(--font);
52
+ font-weight: var(--btn-font-weight);
53
+ font-size: var(--btn-font-size-medium);
54
+ height: var(--btn-height-medium);
55
+ padding: var(--btn-padding-medium);
56
+ line-height: 1;
57
+ white-space: nowrap;
58
+ text-decoration: none;
59
+ outline: none;
60
+ transition: var(--btn-transition);
61
+ user-select: none;
62
+ box-sizing: border-box;
63
+ vertical-align: middle;
64
+
65
+ &.is-small {
66
+ height: var(--btn-height-small);
67
+ padding: var(--btn-padding-small);
68
+ font-size: var(--btn-font-size-small);
69
+ }
70
+
71
+ &.is-large {
72
+ height: var(--btn-height-large);
73
+ padding: var(--btn-padding-large);
74
+ font-size: var(--btn-font-size-large);
75
+ }
76
+
77
+ &.is-block {
78
+ width: 100%;
79
+ display: flex;
80
+ }
81
+
82
+ &.is-rounded {
83
+ border-radius: var(--radius-x);
84
+ }
85
+
86
+ &.is-pill {
87
+ border-radius: var(--radius-pill);
88
+ }
89
+
90
+ &.is-circle {
91
+ border-radius: 50%;
92
+ padding: 0;
93
+ width: var(--btn-height-medium);
94
+
95
+ &.is-small {
96
+ width: var(--btn-height-small);
97
+ }
98
+
99
+ &.is-large {
100
+ width: var(--btn-height-large);
101
+ }
102
+ }
103
+
104
+ &.is-icon-top,
105
+ &.is-icon-bottom {
106
+ flex-direction: column;
107
+ }
108
+
109
+ &.is-loading,
110
+ &.is-disabled {
111
+ opacity: var(--btn-disabled-opacity);
112
+ cursor: not-allowed;
113
+ pointer-events: none;
114
+ }
115
+
116
+ &.is-primary {
117
+ background: var(--btn-color-primary);
118
+ color: var(--white);
119
+ border-color: var(--btn-color-primary);
120
+
121
+ &:hover {
122
+ background: var(--btn-color-primary-hover);
123
+ border-color: var(--btn-color-primary-hover);
124
+ }
125
+ }
126
+
127
+ &.is-secondary {
128
+ background: var(--btn-color-secondary);
129
+ color: var(--btn-color-secondary-text);
130
+ border-color: var(--btn-color-secondary);
131
+
132
+ &:hover {
133
+ background: var(--btn-color-secondary-hover);
134
+ border-color: var(--btn-color-secondary-hover);
135
+ }
136
+ }
137
+
138
+ &.is-danger {
139
+ background: var(--btn-color-danger);
140
+ color: var(--white);
141
+ border-color: var(--btn-color-danger);
142
+
143
+ &:hover {
144
+ background: var(--btn-color-danger-hover);
145
+ border-color: var(--btn-color-danger-hover);
146
+ }
147
+ }
148
+
149
+ &.is-success {
150
+ background: var(--btn-color-success);
151
+ color: var(--white);
152
+ border-color: var(--btn-color-success);
153
+
154
+ &:hover {
155
+ background: var(--btn-color-success-hover);
156
+ border-color: var(--btn-color-success-hover);
157
+ }
158
+ }
159
+
160
+ &.is-warning {
161
+ background: var(--btn-color-warning);
162
+ color: var(--white);
163
+ border-color: var(--btn-color-warning);
164
+
165
+ &:hover {
166
+ background: var(--btn-color-warning-hover);
167
+ border-color: var(--btn-color-warning-hover);
168
+ }
169
+ }
170
+
171
+ &.is-info {
172
+ background: var(--btn-color-info);
173
+ color: var(--white);
174
+ border-color: var(--btn-color-info);
175
+
176
+ &:hover {
177
+ background: var(--btn-color-info-hover);
178
+ border-color: var(--btn-color-info-hover);
179
+ }
180
+ }
181
+
182
+ &.is-ghost {
183
+ background: transparent;
184
+ color: var(--btn-color-ghost-text);
185
+ border-color: transparent;
186
+
187
+ &:hover {
188
+ background: var(--btn-color-ghost-hover);
189
+ }
190
+ }
191
+
192
+ &.is-link {
193
+ background: transparent;
194
+ color: var(--btn-color-link);
195
+ border-color: transparent;
196
+ text-decoration: underline;
197
+ text-underline-offset: 2px;
198
+
199
+ &:hover {
200
+ color: var(--btn-color-link-hover);
201
+ }
202
+ }
203
+
204
+ &.is-outline {
205
+ background: transparent;
206
+
207
+ &.is-primary {
208
+ color: var(--btn-color-primary);
209
+ border-color: var(--btn-color-primary);
210
+
211
+ &:hover {
212
+ background: var(--btn-color-primary);
213
+ color: var(--white);
214
+ }
215
+ }
216
+
217
+ &.is-danger {
218
+ color: var(--btn-color-danger);
219
+ border-color: var(--btn-color-danger);
220
+
221
+ &:hover {
222
+ background: var(--btn-color-danger);
223
+ color: var(--white);
224
+ }
225
+ }
226
+
227
+ &.is-success {
228
+ color: var(--btn-color-success);
229
+ border-color: var(--btn-color-success);
230
+
231
+ &:hover {
232
+ background: var(--btn-color-success);
233
+ color: var(--white);
234
+ }
235
+ }
236
+
237
+ &.is-warning {
238
+ color: var(--btn-color-warning);
239
+ border-color: var(--btn-color-warning);
240
+
241
+ &:hover {
242
+ background: var(--btn-color-warning);
243
+ color: var(--white);
244
+ }
245
+ }
246
+
247
+ &.is-info {
248
+ color: var(--btn-color-info);
249
+ border-color: var(--btn-color-info);
250
+
251
+ &:hover {
252
+ background: var(--btn-color-info);
253
+ color: var(--white);
254
+ }
255
+ }
256
+
257
+ &.is-secondary {
258
+ color: var(--btn-color-secondary-text);
259
+ border-color: var(--gray-lite-2);
260
+
261
+ &:hover {
262
+ background: var(--btn-color-secondary);
263
+ }
264
+ }
265
+ }
266
+
267
+ &.is-icon-only {
268
+ padding: 0;
269
+ width: var(--btn-height-medium);
270
+
271
+ &.is-small { width: var(--btn-height-small); }
272
+ &.is-large { width: var(--btn-height-large); }
273
+ }
274
+ }
275
+ .btn.is-loading:not(.is-outline) .spinner,
276
+ .btn.is-loading:not(.is-ghost) .spinner {
277
+ --spinner-color: white !important;
278
+ }
279
+
280
+ .btn-icon {
281
+ display: inline-flex;
165
282
  align-items: center;
166
283
  flex-shrink: 0;
167
- width: var(--btn-icon-size-md);
168
- height: var(--btn-icon-size-md);
169
- }
170
- .btn--sm .btn__icon {
171
- width: var(--btn-icon-size-sm);
172
- height: var(--btn-icon-size-sm);
173
- }
174
- .btn--lg .btn__icon {
175
- width: var(--btn-icon-size-lg);
176
- height: var(--btn-icon-size-lg);
177
- }
178
- .btn--icon-top,
179
- .btn--icon-bottom { flex-direction: column; }
180
-
181
- /* ─────────────────────────────────────────────
182
- Loader
183
- ───────────────────────────────────────────── */
184
- .btn__loader {
185
- display: inline-block;
186
- width: var(--btn-loader-size);
187
- height: var(--btn-loader-size);
188
- border: 2px solid currentColor;
189
- border-top-color: transparent;
190
- border-radius: 50%;
191
- flex-shrink: 0;
192
- animation: btn-spin 0.6s linear infinite;
193
- }
194
- @keyframes btn-spin {
195
- to { transform: rotate(360deg); }
196
- }
197
-
198
- /* ─────────────────────────────────────────────
199
- States
200
- ───────────────────────────────────────────── */
201
- .btn:disabled,
202
- .btn--disabled,
203
- .btn--loading {
204
- opacity: var(--btn-disabled-opacity);
205
- cursor: not-allowed;
206
- pointer-events: none;
207
- }
208
-
209
- /* ─────────────────────────────────────────────
210
- Variants
211
- ───────────────────────────────────────────── */
212
-
213
- /* Primary */
214
- .btn--primary {
215
- background: var(--btn-primary-bg);
216
- color: var(--btn-primary-color);
217
- border-color: var(--btn-primary-border);
218
- }
219
- .btn--primary:hover {
220
- background: var(--btn-primary-bg-hover);
221
- border-color: var(--btn-primary-border-hover);
222
- }
223
-
224
- /* Secondary */
225
- .btn--secondary {
226
- background: var(--btn-secondary-bg);
227
- color: var(--btn-secondary-color);
228
- border-color: var(--btn-secondary-border);
229
- }
230
- .btn--secondary:hover {
231
- background: var(--btn-secondary-bg-hover);
232
- border-color: var(--btn-secondary-border-hover);
233
- }
234
-
235
- /* Danger */
236
- .btn--danger {
237
- background: var(--btn-danger-bg);
238
- color: var(--btn-danger-color);
239
- border-color: var(--btn-danger-border);
240
- }
241
- .btn--danger:hover {
242
- background: var(--btn-danger-bg-hover);
243
- border-color: var(--btn-danger-border-hover);
244
- }
245
-
246
- /* Success */
247
- .btn--success {
248
- background: var(--btn-success-bg);
249
- color: var(--btn-success-color);
250
- border-color: var(--btn-success-border);
251
- }
252
- .btn--success:hover {
253
- background: var(--btn-success-bg-hover);
254
- border-color: var(--btn-success-border-hover);
255
- }
256
-
257
- /* Warning */
258
- .btn--warning {
259
- background: var(--btn-warning-bg);
260
- color: var(--btn-warning-color);
261
- border-color: var(--btn-warning-border);
262
- }
263
- .btn--warning:hover {
264
- background: var(--btn-warning-bg-hover);
265
- border-color: var(--btn-warning-border-hover);
266
- }
267
-
268
- /* Info */
269
- .btn--info {
270
- background: var(--btn-info-bg);
271
- color: var(--btn-info-color);
272
- border-color: var(--btn-info-border);
273
- }
274
- .btn--info:hover {
275
- background: var(--btn-info-bg-hover);
276
- border-color: var(--btn-info-border-hover);
277
- }
278
-
279
- /* Ghost */
280
- .btn--ghost {
281
- background: var(--btn-ghost-bg);
282
- color: var(--btn-ghost-color);
283
- border-color: var(--btn-ghost-border);
284
- }
285
- .btn--ghost:hover {
286
- background: var(--btn-ghost-bg-hover);
287
- border-color: var(--btn-ghost-border-hover);
288
- }
289
-
290
- /* Link */
291
- .btn--link {
292
- background: var(--btn-link-bg);
293
- color: var(--btn-link-color);
294
- border-color: var(--btn-link-border);
295
- text-decoration: underline;
296
- text-underline-offset: 2px;
297
- }
298
- .btn--link:hover {
299
- color: var(--btn-link-color-hover);
300
- }
301
-
302
- /* ─────────────────────────────────────────────
303
- Outline modifier
304
- ───────────────────────────────────────────── */
305
- .btn--outline.btn--primary {
306
- background: transparent;
307
- color: var(--btn-primary-bg);
308
- border-color: var(--btn-primary-bg);
309
- }
310
- .btn--outline.btn--primary:hover {
311
- background: var(--btn-primary-bg);
312
- color: var(--btn-primary-color);
313
- }
314
-
315
- .btn--outline.btn--danger {
316
- background: transparent;
317
- color: var(--btn-danger-bg);
318
- border-color: var(--btn-danger-bg);
319
- }
320
- .btn--outline.btn--danger:hover {
321
- background: var(--btn-danger-bg);
322
- color: var(--btn-danger-color);
323
- }
324
-
325
- .btn--outline.btn--success {
326
- background: transparent;
327
- color: var(--btn-success-bg);
328
- border-color: var(--btn-success-bg);
329
- }
330
- .btn--outline.btn--success:hover {
331
- background: var(--btn-success-bg);
332
- color: var(--btn-success-color);
333
- }
334
-
335
- .btn--outline.btn--warning {
336
- background: transparent;
337
- color: var(--btn-warning-bg);
338
- border-color: var(--btn-warning-bg);
339
- }
340
- .btn--outline.btn--warning:hover {
341
- background: var(--btn-warning-bg);
342
- color: var(--btn-warning-color);
343
- }
344
-
345
- .btn--outline.btn--info {
346
- background: transparent;
347
- color: var(--btn-info-bg);
348
- border-color: var(--btn-info-bg);
349
- }
350
- .btn--outline.btn--info:hover {
351
- background: var(--btn-info-bg);
352
- color: var(--btn-info-color);
353
- }
354
-
355
- .btn--outline.btn--secondary {
356
- background: transparent;
357
- color: var(--btn-secondary-color);
358
- border-color: var(--gray-lite-2);
359
- }
360
- .btn--outline.btn--secondary:hover {
361
- background: var(--btn-secondary-bg);
284
+ width: var(--btn-icon-size-medium);
285
+ height: var(--btn-icon-size-medium);
286
+
287
+ .is-small & {
288
+ width: var(--btn-icon-size-small);
289
+ height: var(--btn-icon-size-small);
290
+ }
291
+
292
+ .is-large & {
293
+ width: var(--btn-icon-size-large);
294
+ height: var(--btn-icon-size-large);
295
+ }
362
296
  }