@scattered-light/loomiere-base-ui 0.0.0-stage → 0.1.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 (46) hide show
  1. package/README.md +26 -2
  2. package/dist/index.d.ts +107 -0
  3. package/dist/index.js +315 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/styles/components/Accordion.css +120 -0
  6. package/dist/styles/components/AlertDialog.css +8 -0
  7. package/dist/styles/components/Autocomplete.css +201 -0
  8. package/dist/styles/components/Avatar.css +134 -0
  9. package/dist/styles/components/Button.css +129 -0
  10. package/dist/styles/components/Checkbox.css +156 -0
  11. package/dist/styles/components/CheckboxGroup.css +15 -0
  12. package/dist/styles/components/Collapsible.css +115 -0
  13. package/dist/styles/components/Combobox.css +484 -0
  14. package/dist/styles/components/ContextMenu.css +168 -0
  15. package/dist/styles/components/Dialog.css +145 -0
  16. package/dist/styles/components/Drawer.css +126 -0
  17. package/dist/styles/components/Field.css +60 -0
  18. package/dist/styles/components/Fieldset.css +41 -0
  19. package/dist/styles/components/Form.css +19 -0
  20. package/dist/styles/components/Input.css +136 -0
  21. package/dist/styles/components/Menu.css +148 -0
  22. package/dist/styles/components/Menubar.css +192 -0
  23. package/dist/styles/components/Meter.css +59 -0
  24. package/dist/styles/components/NavigationMenu.css +419 -0
  25. package/dist/styles/components/NumberField.css +90 -0
  26. package/dist/styles/components/OTPField.css +62 -0
  27. package/dist/styles/components/Popover.css +161 -0
  28. package/dist/styles/components/PreviewCard.css +116 -0
  29. package/dist/styles/components/Progress.css +76 -0
  30. package/dist/styles/components/Radio.css +151 -0
  31. package/dist/styles/components/ScrollArea.css +81 -0
  32. package/dist/styles/components/Select.css +273 -0
  33. package/dist/styles/components/Separator.css +27 -0
  34. package/dist/styles/components/Slider.css +165 -0
  35. package/dist/styles/components/Switch.css +165 -0
  36. package/dist/styles/components/Tabs.css +135 -0
  37. package/dist/styles/components/Toast.css +235 -0
  38. package/dist/styles/components/Toggle.css +109 -0
  39. package/dist/styles/components/ToggleGroup.css +20 -0
  40. package/dist/styles/components/Toolbar.css +61 -0
  41. package/dist/styles/components/Tooltip.css +59 -0
  42. package/dist/styles/index.css +52 -0
  43. package/dist/styles/reset/accessibility.css +65 -0
  44. package/dist/styles/reset/reset-accessibility.css +110 -0
  45. package/dist/styles/reset/reset.css +442 -0
  46. package/package.json +50 -4
@@ -0,0 +1,161 @@
1
+ /* @scattered-light/loomiere-base-ui 0.1.0 · styles for @base-ui/react 1.9.0 */
2
+ /* Popover - Mojave Theme */
3
+
4
+ /* ============================================
5
+ TRIGGER
6
+ ============================================ */
7
+
8
+ .PopoverTrigger {
9
+ display: inline-flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ }
13
+
14
+ /* ============================================
15
+ BACKDROP
16
+ ============================================ */
17
+
18
+ .PopoverBackdrop {
19
+ position: fixed;
20
+ inset: 0;
21
+ background: transparent;
22
+ z-index: var(--sl-z-index-dropdown);
23
+ }
24
+
25
+ /* ============================================
26
+ POSITIONER
27
+ ============================================ */
28
+
29
+ .PopoverPositioner {
30
+ z-index: var(--sl-popup-z-index);
31
+ outline: 0;
32
+ }
33
+
34
+ /* ============================================
35
+ POPUP
36
+ ============================================ */
37
+
38
+ .PopoverPopup {
39
+ box-sizing: border-box;
40
+ background: var(--sl-popup-background);
41
+ border: var(--sl-popup-border-width) solid var(--sl-popup-border-color);
42
+ border-radius: var(--sl-popup-radius);
43
+ box-shadow: var(--sl-popup-shadow);
44
+ outline: none;
45
+ transform-origin: var(--transform-origin);
46
+ transition:
47
+ opacity var(--sl-popup-animation-duration) var(--sl-popup-animation-easing),
48
+ transform var(--sl-popup-animation-duration) var(--sl-popup-animation-easing);
49
+ position: relative;
50
+ min-width: var(--sl-popover-popup-min-width);
51
+ max-width: var(--sl-popover-popup-max-width);
52
+ padding: var(--sl-popup-padding-panel);
53
+ }
54
+
55
+ .PopoverPopup[data-starting-style],
56
+ .PopoverPopup[data-ending-style] {
57
+ opacity: 0;
58
+ transform: scale(var(--sl-popup-scale-closed));
59
+ }
60
+
61
+ /* ============================================
62
+ TITLE
63
+ ============================================ */
64
+
65
+ .PopoverTitle {
66
+ font-family: var(--sl-font-maximize-lg-font-family);
67
+ font-size: var(--sl-font-maximize-lg-font-size);
68
+ font-weight: var(--sl-font-maximize-lg-font-weight);
69
+ line-height: var(--sl-font-maximize-lg-line-height);
70
+ letter-spacing: var(--sl-font-maximize-lg-letter-spacing);
71
+ color: var(--sl-text-primary);
72
+ margin: 0 0 var(--sl-space-block-xs) 0;
73
+ }
74
+
75
+ /* ============================================
76
+ DESCRIPTION
77
+ ============================================ */
78
+
79
+ .PopoverDescription {
80
+ font-family: var(--sl-font-base-font-family);
81
+ font-size: var(--sl-font-base-font-size);
82
+ font-weight: var(--sl-font-base-font-weight);
83
+ line-height: var(--sl-font-base-line-height);
84
+ letter-spacing: var(--sl-font-base-letter-spacing);
85
+ color: var(--sl-text-secondary);
86
+ margin: 0;
87
+ }
88
+
89
+ /* ============================================
90
+ CLOSE BUTTON
91
+ ============================================ */
92
+
93
+ .PopoverClose {
94
+ display: flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ flex-shrink: 0;
98
+ width: var(--sl-icon-button-size);
99
+ height: var(--sl-icon-button-size);
100
+ padding: 0;
101
+ border: none;
102
+ border-radius: var(--sl-icon-button-radius);
103
+ background: transparent;
104
+ color: var(--sl-icon-button-color);
105
+ cursor: pointer;
106
+ outline: none;
107
+ transition: var(--sl-icon-button-transition);
108
+ position: absolute;
109
+ top: var(--sl-icon-button-inset);
110
+ right: var(--sl-icon-button-inset);
111
+ }
112
+
113
+ .PopoverClose:hover {
114
+ background: var(--sl-icon-button-background-hover);
115
+ color: var(--sl-icon-button-color-hover);
116
+ }
117
+
118
+ .PopoverClose:focus-visible {
119
+ outline: var(--sl-focus-outline);
120
+ outline-offset: var(--sl-focus-outline-offset-inset);
121
+ }
122
+
123
+ /* ============================================
124
+ ARROW
125
+ ============================================ */
126
+
127
+ .PopoverArrow {
128
+ display: flex;
129
+ }
130
+
131
+ .PopoverArrow[data-side='top'] {
132
+ bottom: -8px;
133
+ rotate: 180deg;
134
+ }
135
+
136
+ .PopoverArrow[data-side='bottom'] {
137
+ top: -8px;
138
+ rotate: 0deg;
139
+ }
140
+
141
+ .PopoverArrow[data-side='left'] {
142
+ right: -13px;
143
+ rotate: 90deg;
144
+ }
145
+
146
+ .PopoverArrow[data-side='right'] {
147
+ left: -13px;
148
+ rotate: -90deg;
149
+ }
150
+
151
+ .PopoverArrowFill {
152
+ fill: var(--sl-popup-arrow-fill);
153
+ }
154
+
155
+ .PopoverArrowOuterStroke {
156
+ fill: var(--sl-popup-arrow-stroke);
157
+ }
158
+
159
+ .PopoverArrowInnerStroke {
160
+ fill: var(--sl-popup-arrow-stroke);
161
+ }
@@ -0,0 +1,116 @@
1
+ /* @scattered-light/loomiere-base-ui 0.1.0 · styles for @base-ui/react 1.9.0 */
2
+ /* Preview Card - Mojave Theme
3
+ *
4
+ * The popup concept (surface, arrow, motion) with a maximize-lg title and condense
5
+ * description. Only its min and max width are its own (tokens/component/preview-card.json).
6
+ */
7
+
8
+ /* Trigger: a link with a dotted underline, so it reads as "hover for more". */
9
+ .PreviewCardTrigger {
10
+ color: var(--sl-content-link-color);
11
+ text-decoration: underline dotted;
12
+ text-underline-offset: var(--sl-stroke-medium);
13
+ cursor: pointer;
14
+ }
15
+
16
+ .PreviewCardTrigger:hover {
17
+ color: var(--sl-text-accent);
18
+ }
19
+
20
+ .PreviewCardPositioner {
21
+ z-index: var(--sl-popup-z-index);
22
+ outline: 0;
23
+ }
24
+
25
+ .PreviewCardPopup {
26
+ box-sizing: border-box;
27
+ background: var(--sl-popup-background);
28
+ border: var(--sl-popup-border-width) solid var(--sl-popup-border-color);
29
+ border-radius: var(--sl-popup-radius);
30
+ box-shadow: var(--sl-popup-shadow);
31
+ outline: none;
32
+ transform-origin: var(--transform-origin);
33
+ transition:
34
+ opacity var(--sl-popup-animation-duration) var(--sl-popup-animation-easing),
35
+ transform var(--sl-popup-animation-duration) var(--sl-popup-animation-easing);
36
+ position: relative;
37
+ min-width: var(--sl-preview-card-popup-min-width);
38
+ max-width: var(--sl-preview-card-popup-max-width);
39
+ overflow: hidden;
40
+ }
41
+
42
+ .PreviewCardPopup[data-starting-style],
43
+ .PreviewCardPopup[data-ending-style] {
44
+ opacity: 0;
45
+ transform: scale(var(--sl-popup-scale-closed));
46
+ }
47
+
48
+ .PreviewCardImage {
49
+ display: block;
50
+ width: 100%;
51
+ height: auto;
52
+ }
53
+
54
+ .PreviewCardContent {
55
+ padding: var(--sl-popup-padding-panel);
56
+ }
57
+
58
+ .PreviewCardTitle {
59
+ font-family: var(--sl-font-maximize-lg-font-family);
60
+ font-size: var(--sl-font-maximize-lg-font-size);
61
+ font-weight: var(--sl-font-maximize-lg-font-weight);
62
+ line-height: var(--sl-font-maximize-lg-line-height);
63
+ letter-spacing: var(--sl-font-maximize-lg-letter-spacing);
64
+ margin: 0 0 var(--sl-space-2) 0;
65
+ color: var(--sl-text-primary);
66
+ }
67
+
68
+ .PreviewCardDescription {
69
+ font-family: var(--sl-font-condense-font-family);
70
+ font-size: var(--sl-font-condense-font-size);
71
+ font-weight: var(--sl-font-condense-font-weight);
72
+ line-height: var(--sl-font-condense-line-height);
73
+ letter-spacing: var(--sl-font-condense-letter-spacing);
74
+ margin: 0;
75
+ color: var(--sl-text-secondary);
76
+ }
77
+
78
+ /* ============================================
79
+ ARROW
80
+ ============================================ */
81
+
82
+ .PreviewCardArrow {
83
+ display: flex;
84
+ }
85
+
86
+ .PreviewCardArrow[data-side='top'] {
87
+ bottom: -8px;
88
+ rotate: 180deg;
89
+ }
90
+
91
+ .PreviewCardArrow[data-side='bottom'] {
92
+ top: -8px;
93
+ rotate: 0deg;
94
+ }
95
+
96
+ .PreviewCardArrow[data-side='left'] {
97
+ right: -13px;
98
+ rotate: 90deg;
99
+ }
100
+
101
+ .PreviewCardArrow[data-side='right'] {
102
+ left: -13px;
103
+ rotate: -90deg;
104
+ }
105
+
106
+ .PreviewCardArrowFill {
107
+ fill: var(--sl-popup-arrow-fill);
108
+ }
109
+
110
+ .PreviewCardArrowOuterStroke {
111
+ fill: var(--sl-popup-arrow-stroke);
112
+ }
113
+
114
+ .PreviewCardArrowInnerStroke {
115
+ fill: var(--sl-popup-arrow-stroke);
116
+ }
@@ -0,0 +1,76 @@
1
+ /* @scattered-light/loomiere-base-ui 0.1.0 · styles for @base-ui/react 1.9.0 */
2
+ /* Progress - Mojave Theme
3
+ *
4
+ * A gauge (tokens/semantic/gauge.json), the same bar as Meter. The fill is the solid color of
5
+ * the scope around it: the accent by default, or set data-color on the root (success, warning,
6
+ * error, any palette).
7
+ */
8
+
9
+ .ProgressRoot {
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: var(--sl-gauge-gap);
13
+ width: 100%;
14
+ }
15
+
16
+ .ProgressHeader {
17
+ display: flex;
18
+ justify-content: space-between;
19
+ align-items: center;
20
+ }
21
+
22
+ .ProgressLabel {
23
+ font-family: var(--sl-font-base-label-font-family);
24
+ font-size: var(--sl-font-base-label-font-size);
25
+ font-weight: var(--sl-font-base-label-font-weight);
26
+ line-height: var(--sl-font-base-label-line-height);
27
+ letter-spacing: var(--sl-font-base-label-letter-spacing);
28
+ color: var(--sl-gauge-label-color);
29
+ }
30
+
31
+ .ProgressValue {
32
+ font-family: var(--sl-font-minimize-font-family);
33
+ font-size: var(--sl-font-minimize-font-size);
34
+ font-weight: var(--sl-font-minimize-font-weight);
35
+ line-height: var(--sl-font-minimize-line-height);
36
+ letter-spacing: var(--sl-font-minimize-letter-spacing);
37
+ color: var(--sl-gauge-value-color);
38
+ }
39
+
40
+ .ProgressTrack {
41
+ position: relative;
42
+ height: var(--sl-gauge-height);
43
+ background: var(--sl-gauge-track-color);
44
+ border-radius: var(--sl-gauge-radius);
45
+ overflow: hidden;
46
+ }
47
+
48
+ .ProgressIndicator {
49
+ height: 100%;
50
+ background: var(--sl-scope-solid);
51
+ border-radius: var(--sl-gauge-radius);
52
+ transition: var(--sl-gauge-transition);
53
+ }
54
+
55
+ /* Indeterminate: the fill sweeps across while the amount is unknown */
56
+ .ProgressRoot[data-indeterminate] .ProgressIndicator {
57
+ width: 50%;
58
+ animation: progressIndeterminate var(--sl-gauge-indeterminate-duration) ease-in-out infinite;
59
+ }
60
+
61
+ @keyframes progressIndeterminate {
62
+ 0% {
63
+ transform: translateX(-100%);
64
+ }
65
+ 100% {
66
+ transform: translateX(200%);
67
+ }
68
+ }
69
+
70
+ .ProgressRoot[data-size='sm'] .ProgressTrack {
71
+ height: var(--sl-gauge-height-sm);
72
+ }
73
+
74
+ .ProgressRoot[data-size='lg'] .ProgressTrack {
75
+ height: var(--sl-gauge-height-lg);
76
+ }
@@ -0,0 +1,151 @@
1
+ /* @scattered-light/loomiere-base-ui 0.1.0 · styles for @base-ui/react 1.9.0 */
2
+ /* Radio - Mojave Theme
3
+ * Same box as Checkbox, always round. Sizes follow the label the same way, and the
4
+ * dot is a share of the circle (check.dot-scale).
5
+ */
6
+
7
+ /* ============================================
8
+ ROOT (label wrapper)
9
+ ============================================ */
10
+
11
+ .RadioRoot {
12
+ display: inline-flex;
13
+ align-items: center;
14
+ gap: var(--sl-gap-control);
15
+ color: var(--sl-text-primary);
16
+ cursor: pointer;
17
+ user-select: none;
18
+ --radio-size: var(--sl-icon-size-magnify);
19
+ }
20
+
21
+ .RadioRoot[data-size='sm'] {
22
+ --radio-size: var(--sl-icon-size-base);
23
+ }
24
+
25
+ .RadioRoot[data-size='lg'] {
26
+ --radio-size: var(--sl-icon-size-maximize);
27
+ }
28
+
29
+ .RadioRoot[data-disabled] {
30
+ cursor: not-allowed;
31
+ }
32
+
33
+ /* ============================================
34
+ RADIO BUTTON (Radio.Root element)
35
+ ============================================ */
36
+
37
+ .RadioButton {
38
+ box-sizing: border-box;
39
+ display: inline-flex;
40
+ align-items: center;
41
+ justify-content: center;
42
+ flex-shrink: 0;
43
+ margin: 0;
44
+ padding: 0;
45
+ border: var(--sl-check-border-width) solid var(--sl-check-border-color);
46
+ background: var(--sl-check-background);
47
+ cursor: pointer;
48
+ outline: none;
49
+ transition: var(--sl-check-transition);
50
+ width: var(--radio-size);
51
+ height: var(--radio-size);
52
+ border-radius: var(--sl-radius-pill);
53
+ }
54
+
55
+ .RadioRoot:hover .RadioButton[data-unchecked]:not([disabled]) {
56
+ border-color: var(--sl-check-border-color-hover);
57
+ }
58
+
59
+ .RadioButton[data-checked] {
60
+ background: var(--sl-check-background-checked);
61
+ border-color: var(--sl-check-border-color-checked);
62
+ }
63
+
64
+ .RadioButton:focus-visible {
65
+ outline: var(--sl-focus-outline);
66
+ outline-offset: var(--sl-focus-outline-offset);
67
+ box-shadow: 0 0 0 var(--sl-focus-halo-spread) var(--sl-focus-halo-color);
68
+ }
69
+
70
+ .RadioButton[disabled] {
71
+ opacity: var(--sl-check-opacity-disabled);
72
+ cursor: not-allowed;
73
+ }
74
+
75
+ /* ============================================
76
+ RADIO INDICATOR (inner dot)
77
+ ============================================ */
78
+
79
+ .RadioIndicator {
80
+ display: inline-flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ flex-shrink: 0;
84
+ line-height: 1;
85
+ }
86
+
87
+ .RadioIndicator[data-unchecked] {
88
+ display: none;
89
+ }
90
+
91
+ .RadioIndicator::before {
92
+ content: '';
93
+ width: round(var(--radio-size) * var(--sl-check-dot-scale), 1px);
94
+ height: round(var(--radio-size) * var(--sl-check-dot-scale), 1px);
95
+ border-radius: var(--sl-radius-pill);
96
+ background-color: var(--sl-check-mark-color);
97
+ animation: radioScale var(--sl-duration-fast) var(--sl-easing-out);
98
+ }
99
+
100
+ @keyframes radioScale {
101
+ from {
102
+ opacity: 0;
103
+ transform: scale(0);
104
+ }
105
+ to {
106
+ opacity: 1;
107
+ transform: scale(1);
108
+ }
109
+ }
110
+
111
+ /* ============================================
112
+ LABEL
113
+ ============================================ */
114
+
115
+ .RadioLabel {
116
+ font-family: var(--sl-font-base-font-family);
117
+ font-size: var(--sl-font-base-font-size);
118
+ font-weight: var(--sl-font-base-font-weight);
119
+ line-height: var(--sl-font-base-line-height);
120
+ letter-spacing: var(--sl-font-base-letter-spacing);
121
+ }
122
+
123
+ .RadioRoot[data-size='sm'] .RadioLabel {
124
+ font-family: var(--sl-font-condense-font-family);
125
+ font-size: var(--sl-font-condense-font-size);
126
+ font-weight: var(--sl-font-condense-font-weight);
127
+ line-height: var(--sl-font-condense-line-height);
128
+ letter-spacing: var(--sl-font-condense-letter-spacing);
129
+ }
130
+
131
+ .RadioRoot[data-size='lg'] .RadioLabel {
132
+ font-family: var(--sl-font-magnify-font-family);
133
+ font-size: var(--sl-font-magnify-font-size);
134
+ font-weight: var(--sl-font-magnify-font-weight);
135
+ line-height: var(--sl-font-magnify-line-height);
136
+ letter-spacing: var(--sl-font-magnify-letter-spacing);
137
+ }
138
+
139
+ .RadioRoot[data-disabled] .RadioLabel {
140
+ color: var(--sl-text-disabled);
141
+ }
142
+
143
+ /* ============================================
144
+ GROUP
145
+ ============================================ */
146
+
147
+ .RadioGroup {
148
+ display: flex;
149
+ flex-direction: column;
150
+ gap: var(--sl-gap-stack-sm);
151
+ }
@@ -0,0 +1,81 @@
1
+ /* @scattered-light/loomiere-base-ui 0.1.0 · styles for @base-ui/react 1.9.0 */
2
+ /* Scroll Area - Mojave Theme
3
+ *
4
+ * The scrollbar is the content scrollbar (content.scrollbar-*): a track that stays clear until
5
+ * you reach for it, and a thumb in the strong fills. No component tokens.
6
+ */
7
+
8
+ .ScrollAreaRoot {
9
+ position: relative;
10
+ overflow: hidden;
11
+ }
12
+
13
+ .ScrollAreaViewport {
14
+ width: 100%;
15
+ height: 100%;
16
+ overflow: hidden;
17
+ }
18
+
19
+ /* ============================================
20
+ SCROLLBAR
21
+ ============================================ */
22
+
23
+ /* 12px bar with the thumb inset by a medium stroke */
24
+ .ScrollAreaScrollbar {
25
+ display: flex;
26
+ user-select: none;
27
+ touch-action: none;
28
+ padding: var(--sl-stroke-medium);
29
+ background: var(--sl-content-scrollbar-track);
30
+ transition: background-color var(--sl-duration-normal) var(--sl-easing-default);
31
+ }
32
+
33
+ .ScrollAreaScrollbar:hover {
34
+ background: var(--sl-fill-subtle);
35
+ }
36
+
37
+ .ScrollAreaScrollbar[data-orientation='vertical'] {
38
+ width: var(--sl-space-3);
39
+ flex-direction: column;
40
+ }
41
+
42
+ .ScrollAreaScrollbar[data-orientation='horizontal'] {
43
+ height: var(--sl-space-3);
44
+ flex-direction: row;
45
+ }
46
+
47
+ /* ============================================
48
+ THUMB
49
+ ============================================ */
50
+
51
+ .ScrollAreaThumb {
52
+ flex: 1;
53
+ position: relative;
54
+ background: var(--sl-content-scrollbar-thumb);
55
+ border-radius: var(--sl-radius-pill);
56
+ cursor: pointer;
57
+ transition: background-color var(--sl-duration-normal) var(--sl-easing-default);
58
+ }
59
+
60
+ .ScrollAreaThumb:hover,
61
+ .ScrollAreaThumb:active,
62
+ .ScrollAreaThumb[data-dragging] {
63
+ background: var(--sl-content-scrollbar-thumb-hover);
64
+ }
65
+
66
+ /* A 44px hit area however small the thumb gets */
67
+ .ScrollAreaThumb::before {
68
+ content: '';
69
+ position: absolute;
70
+ top: 50%;
71
+ left: 50%;
72
+ transform: translate(-50%, -50%);
73
+ width: 100%;
74
+ height: 100%;
75
+ min-width: 44px;
76
+ min-height: 44px;
77
+ }
78
+
79
+ .ScrollAreaCorner {
80
+ background: transparent;
81
+ }