@olenbetong/appframe-ds 1.1.0 → 1.2.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 (173) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/package.json +6 -5
  3. package/scripts/copyAssets.mjs +27 -55
  4. package/src/AfLookup/Lookup.css +129 -125
  5. package/src/AfLookup/Lookup.tsx +184 -162
  6. package/src/AfLookup/LookupCombobox.css +78 -78
  7. package/src/AfLookup/LookupCombobox.tsx +237 -237
  8. package/src/AfLookup/LookupEdit.tsx +130 -130
  9. package/src/AfLookup/LookupGrid.tsx +124 -124
  10. package/src/AfLookup/index.ts +5 -5
  11. package/src/autocomplete/Autocomplete.css +256 -256
  12. package/src/autocomplete/Autocomplete.tsx +320 -320
  13. package/src/autocomplete/AutocompleteFrame.tsx +168 -168
  14. package/src/autocomplete/Combobox.tsx +286 -286
  15. package/src/autocomplete/index.ts +4 -4
  16. package/src/autocomplete/types.ts +204 -204
  17. package/src/autocomplete/utils.ts +183 -183
  18. package/src/binding/BoundNumericTextField.tsx +102 -102
  19. package/src/binding/BoundTextField.tsx +49 -49
  20. package/src/binding/CancelButton.tsx +30 -30
  21. package/src/binding/CancelIconButton.tsx +30 -30
  22. package/src/binding/DataEditToolbar.tsx +92 -92
  23. package/src/binding/DeleteButton.tsx +35 -35
  24. package/src/binding/DeleteIconButton.tsx +35 -35
  25. package/src/binding/RefreshButton.tsx +31 -31
  26. package/src/binding/RefreshIconButton.tsx +33 -33
  27. package/src/binding/RefreshRowIconButton.tsx +33 -33
  28. package/src/binding/SaveButton.tsx +37 -37
  29. package/src/binding/SaveIconButton.tsx +38 -38
  30. package/src/container/Container.tsx +49 -49
  31. package/src/container/index.ts +1 -1
  32. package/src/cutoff/CutOffPicker.css +12 -0
  33. package/src/cutoff/CutOffPicker.tsx +165 -0
  34. package/src/cutoff/context.tsx +194 -0
  35. package/src/cutoff/dsCutOffDates.ts +21 -0
  36. package/src/cutoff/index.ts +4 -0
  37. package/src/cutoff/utils.test.ts +59 -0
  38. package/src/cutoff/utils.ts +276 -0
  39. package/src/filter/ChipListInput.tsx +79 -79
  40. package/src/filter/FieldFilterPanel.css +150 -150
  41. package/src/filter/FieldFilterPanel.tsx +309 -309
  42. package/src/filter/FilterBuilder.css +152 -152
  43. package/src/filter/FilterBuilder.test.tsx +153 -153
  44. package/src/filter/FilterBuilder.tsx +435 -435
  45. package/src/filter/FilterEditor.css +231 -231
  46. package/src/filter/FilterEditor.test.tsx +259 -259
  47. package/src/filter/FilterEditor.tsx +75 -75
  48. package/src/filter/FilterGroupEditor.tsx +160 -160
  49. package/src/filter/FilterNameDialog.css +22 -22
  50. package/src/filter/FilterNameDialog.tsx +81 -81
  51. package/src/filter/FilterRow.tsx +117 -117
  52. package/src/filter/FilterShareDialog.css +28 -28
  53. package/src/filter/FilterShareDialog.tsx +201 -201
  54. package/src/filter/FilterStringField.tsx +78 -78
  55. package/src/filter/FilterValueEditor.tsx +220 -220
  56. package/src/filter/SavedFilterTree.css +107 -107
  57. package/src/filter/SavedFilterTree.test.tsx +94 -94
  58. package/src/filter/SavedFilterTree.tsx +218 -218
  59. package/src/filter/fieldFilter.test.ts +158 -158
  60. package/src/filter/fieldFilter.ts +139 -139
  61. package/src/filter/index.ts +27 -27
  62. package/src/filter/types.ts +38 -38
  63. package/src/filter/useDistinctValues.test.ts +102 -102
  64. package/src/filter/useDistinctValues.ts +230 -230
  65. package/src/global.d.ts +11 -11
  66. package/src/grid/AfGridColumnsPanel.tsx +118 -118
  67. package/src/grid/AfGridContext.tsx +51 -51
  68. package/src/grid/AfGridError.tsx +46 -46
  69. package/src/grid/AfHeaderFilterCell.tsx +147 -147
  70. package/src/grid/AfHeaderFilterPanel.tsx +111 -111
  71. package/src/grid/GridEditLookup.css +12 -0
  72. package/src/grid/GridEditLookup.tsx +121 -0
  73. package/src/grid/Toolbar.tsx +233 -233
  74. package/src/grid/editing.ts +100 -100
  75. package/src/grid/filter.ts +78 -78
  76. package/src/grid/formatters.ts +48 -48
  77. package/src/grid/index.css +245 -245
  78. package/src/grid/index.tsx +489 -484
  79. package/src/grid/license.ts +48 -48
  80. package/src/grid/localization.ts +369 -369
  81. package/src/grid/slots/index.tsx +307 -307
  82. package/src/grid/slots/slots.css +64 -64
  83. package/src/grid/theme.tsx +138 -138
  84. package/src/grid/useAfColumns.tsx +371 -371
  85. package/src/grid/useAfCurrentIndex.ts +63 -63
  86. package/src/grid/useAfData.ts +20 -20
  87. package/src/grid/useAfFilter.ts +160 -160
  88. package/src/grid/useAfFilterFields.ts +55 -55
  89. package/src/grid/useAfGridApi.ts +71 -71
  90. package/src/grid/useAfKeyBindings.ts +36 -36
  91. package/src/grid/useAfNewItemRow.ts +258 -258
  92. package/src/grid/useAfPagination.ts +53 -53
  93. package/src/grid/useAfPersistedState.ts +230 -230
  94. package/src/grid/useAfRowEditModel.ts +145 -145
  95. package/src/grid/useAfRowGrouping.ts +47 -47
  96. package/src/grid/useAfServerAggregation.ts +145 -145
  97. package/src/grid/useAfSortModel.ts +84 -84
  98. package/src/i18n.ts +13 -13
  99. package/src/index.ts +14 -12
  100. package/src/input/InputAdornments.css +75 -75
  101. package/src/input/InputAdornments.tsx +102 -102
  102. package/src/input/index.ts +1 -1
  103. package/src/layout/AppMenu.tsx +74 -74
  104. package/src/layout/AppMenuDrawer.css +70 -70
  105. package/src/layout/AppMenuDrawer.tsx +122 -122
  106. package/src/layout/ErrorBoundary.tsx +162 -162
  107. package/src/layout/ResponsiveDialog.css +86 -0
  108. package/src/layout/ResponsiveDialog.tsx +55 -0
  109. package/src/layout/index.tsx +69 -68
  110. package/src/link/Link.tsx +23 -0
  111. package/src/link/index.ts +1 -0
  112. package/src/mdi/Mdi.css +138 -138
  113. package/src/mdi/Mdi.test.tsx +91 -91
  114. package/src/mdi/Mdi.tsx +141 -141
  115. package/src/mdi/MdiConfirmCloseDialog.tsx +47 -47
  116. package/src/mdi/MdiContext.tsx +59 -59
  117. package/src/mdi/MdiDocumentContext.tsx +60 -60
  118. package/src/mdi/MdiPanel.tsx +61 -61
  119. package/src/mdi/MdiRestore.test.tsx +86 -86
  120. package/src/mdi/MdiTab.tsx +30 -30
  121. package/src/mdi/controller.test.ts +382 -382
  122. package/src/mdi/controller.ts +656 -656
  123. package/src/mdi/dockviewHost.ts +132 -132
  124. package/src/mdi/fakeHost.ts +200 -200
  125. package/src/mdi/host.ts +44 -44
  126. package/src/mdi/ids.test.ts +20 -20
  127. package/src/mdi/ids.ts +18 -18
  128. package/src/mdi/index.ts +31 -31
  129. package/src/mdi/layoutRestore.test.ts +156 -156
  130. package/src/mdi/layoutRestore.ts +311 -311
  131. package/src/mdi/layoutSpec.test.ts +143 -143
  132. package/src/mdi/layoutSpec.ts +214 -214
  133. package/src/mdi/layoutStore.test.ts +93 -93
  134. package/src/mdi/layoutStore.ts +99 -99
  135. package/src/mdi/memorySettingsStore.ts +21 -21
  136. package/src/mdi/registry.ts +34 -34
  137. package/src/mdi/testTypes.ts +37 -37
  138. package/src/mdi/theme.ts +22 -22
  139. package/src/mdi/types.ts +214 -214
  140. package/src/page/Page.css +53 -53
  141. package/src/page/PageBlock.css +64 -64
  142. package/src/page/PageBlock.tsx +92 -92
  143. package/src/page/PageHeader.css +88 -88
  144. package/src/page/PageHeader.tsx +115 -115
  145. package/src/page/PageTitle.css +5 -0
  146. package/src/page/PageTitle.tsx +21 -0
  147. package/src/page/index.ts +4 -3
  148. package/src/paper/Paper.tsx +52 -52
  149. package/src/progress/LinearProgress.css +93 -93
  150. package/src/progress/LinearProgress.tsx +104 -104
  151. package/src/progress/index.ts +1 -1
  152. package/src/report-downloader/ReportDownloader.css +67 -67
  153. package/src/report-downloader/components/StatusItem.tsx +87 -87
  154. package/src/report-downloader/components/StatusList.tsx +28 -28
  155. package/src/report-downloader/index.ts +41 -41
  156. package/src/report-downloader/status.tsx +92 -92
  157. package/src/sortable/DropIndicator.css +51 -51
  158. package/src/sortable/DropIndicator.tsx +27 -27
  159. package/src/sortable/SortableItemList.css +21 -21
  160. package/src/sortable/SortableItemList.tsx +264 -264
  161. package/src/sortable/index.ts +8 -8
  162. package/src/sortable/reorderSortOrder.ts +126 -126
  163. package/src/sortable/sortOrder.ts +101 -101
  164. package/src/sortable/types.ts +9 -9
  165. package/src/sortable/useSortableContainer.ts +53 -53
  166. package/src/sortable/useSortableItem.ts +95 -95
  167. package/src/sortable/useSortableList.ts +117 -117
  168. package/src/test/happy-dom-document-class.ts +24 -24
  169. package/src/test/setup.ts +12 -12
  170. package/src/theme/useDsColorScheme.ts +53 -53
  171. package/tsconfig.build.json +9 -9
  172. package/tsconfig.json +8 -8
  173. package/vitest.config.ts +10 -10
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @olenbetong/appframe-ds
2
2
 
3
+ ## 1.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - b38f806: Three more `@olenbetong/appframe-mui` equivalents, so apps can drop that package: the cut-off period family (`CutOffPicker`, `CutOffProvider`, `useCutOff`, `cutOffToPlainDate`, `plainDateToCutOff`, `getPeriodLabel`, the range helpers and `PeriodType`), `ResponsiveDialog` (a Designsystemet `Dialog` that fills small screens, decided by CSS), and `PageTitle` (a Designsystemet `Heading`). Also `Link` (a Designsystemet link that navigates with react-router), `GridEditLookup` for `@olenbetong/appframe-ds/grid`, and MUI X re-exported from the grid entry as the `DataGrid` namespace, so a platform app never bundles its own copy. The cut-off utilities use Temporal for ISO weeks; the package now depends on `temporal-polyfill`.
8
+ - cd7fc4f: Add label tag support with optional and required indicators.
9
+
3
10
  ## 1.1.0
4
11
 
5
12
  ### Minor Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olenbetong/appframe-ds",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Components that bind Designsystemet components to Appframe data objects",
5
5
  "type": "module",
6
6
  "types": "./es/index.d.ts",
@@ -61,7 +61,7 @@
61
61
  },
62
62
  "dependencies": {
63
63
  "@atlaskit/pragmatic-drag-and-drop": "3.1.0",
64
- "@atlaskit/pragmatic-drag-and-drop-hitbox": "2.2.0",
64
+ "@atlaskit/pragmatic-drag-and-drop-hitbox": "2.2.2",
65
65
  "@base-ui/react": "1.8.0",
66
66
  "clsx": "^2.1.1",
67
67
  "dockview-react": "8.3.1",
@@ -70,19 +70,20 @@
70
70
  "react": "19.3.0",
71
71
  "react-dom": "19.3.0",
72
72
  "react-window": "2.3.1",
73
+ "temporal-polyfill": "1.0.5",
73
74
  "@olenbetong/appframe-core": "2.14.0",
74
75
  "@olenbetong/appframe-data": "1.7.2",
75
76
  "@olenbetong/appframe-react": "2.2.1"
76
77
  },
77
78
  "devDependencies": {
78
- "@digdir/designsystemet-react": "1.21.1",
79
+ "@digdir/designsystemet-react": "1.22.0",
79
80
  "@emotion/react": "^11.14.0",
80
81
  "@emotion/styled": "^11.14.1",
81
82
  "@mui/material": "9.4.0",
82
83
  "@mui/x-data-grid-premium": "8.29.3",
83
84
  "@mui/x-license": "8.29.3",
84
85
  "@navikt/aksel-icons": "8.16.2",
85
- "@testing-library/dom": "^10.4.1",
86
+ "@testing-library/dom": "^10.4.2",
86
87
  "@testing-library/jest-dom": "^7.0.1",
87
88
  "@testing-library/react": "16.3.3",
88
89
  "@testing-library/user-event": "^14.6.7",
@@ -90,7 +91,7 @@
90
91
  "@types/react-dom": "19.3.0",
91
92
  "happy-dom": "20.14.5",
92
93
  "react-error-boundary": "6.1.5",
93
- "react-router": "8.3.1",
94
+ "react-router": "8.4.0",
94
95
  "typescript": "7.0.2"
95
96
  },
96
97
  "scripts": {
@@ -1,55 +1,27 @@
1
- import { cpSync, mkdirSync } from "node:fs";
2
-
3
- const files = [
4
- ["src/AfLookup/Lookup.css", "es/AfLookup/Lookup.css"],
5
- ["src/AfLookup/LookupGrid.css", "es/AfLookup/LookupGrid.css"],
6
- ["src/AfLookup/LookupCombobox.css", "es/AfLookup/LookupCombobox.css"],
7
- ["src/layout/AppMenu.css", "es/layout/AppMenu.css"],
8
- ["src/layout/AppMenuDrawer.css", "es/layout/AppMenuDrawer.css"],
9
- ["src/layout/AppMenuItem.css", "es/layout/AppMenuItem.css"],
10
- ["src/layout/AppMenuSubheader.css", "es/layout/AppMenuSubheader.css"],
11
- ["src/layout/AppLayoutDesktop.css", "es/layout/AppLayoutDesktop.css"],
12
- ["src/layout/AppLayoutMobile.css", "es/layout/AppLayoutMobile.css"],
13
- ["src/layout/index.css", "es/layout/index.css"],
14
- ["src/layout/ErrorBoundary.css", "es/layout/ErrorBoundary.css"],
15
- ["src/layout/PageContainer.css", "es/layout/PageContainer.css"],
16
- ["src/page/Page.css", "es/page/Page.css"],
17
- ["src/page/PageBlock.css", "es/page/PageBlock.css"],
18
- ["src/page/PageHeader.css", "es/page/PageHeader.css"],
19
- ["src/list/ItemList.css", "es/list/ItemList.css"],
20
- ["src/input/InputAdornments.css", "es/input/InputAdornments.css"],
21
- ["src/paper/Paper.css", "es/paper/Paper.css"],
22
- ["src/progress/LinearProgress.css", "es/progress/LinearProgress.css"],
23
- ["src/sortable/DropIndicator.css", "es/sortable/DropIndicator.css"],
24
- ["src/sortable/SortableItemList.css", "es/sortable/SortableItemList.css"],
25
- ["src/autocomplete/Autocomplete.css", "es/autocomplete/Autocomplete.css"],
26
- ["src/filter/FilterBuilder.css", "es/filter/FilterBuilder.css"],
27
- ["src/filter/FieldFilterPanel.css", "es/filter/FieldFilterPanel.css"],
28
- ["src/filter/FilterEditor.css", "es/filter/FilterEditor.css"],
29
- ["src/filter/FilterNameDialog.css", "es/filter/FilterNameDialog.css"],
30
- ["src/filter/FilterShareDialog.css", "es/filter/FilterShareDialog.css"],
31
- ["src/filter/SavedFilterTree.css", "es/filter/SavedFilterTree.css"],
32
- ["src/grid/index.css", "es/grid/index.css"],
33
- ["src/grid/slots/slots.css", "es/grid/slots/slots.css"],
34
- ["src/mdi/Mdi.css", "es/mdi/Mdi.css"],
35
- ["src/report-downloader/ReportDownloader.css", "es/report-downloader/ReportDownloader.css"],
36
- ];
37
-
38
- mkdirSync("es/layout", { recursive: true });
39
- mkdirSync("es/input", { recursive: true });
40
- mkdirSync("es/list", { recursive: true });
41
- mkdirSync("es/page", { recursive: true });
42
- mkdirSync("es/paper", { recursive: true });
43
- mkdirSync("es/progress", { recursive: true });
44
- mkdirSync("es/sortable", { recursive: true });
45
- mkdirSync("es/autocomplete", { recursive: true });
46
- mkdirSync("es/filter", { recursive: true });
47
- mkdirSync("es/grid", { recursive: true });
48
- mkdirSync("es/grid/slots", { recursive: true });
49
- mkdirSync("es/mdi", { recursive: true });
50
- mkdirSync("es/report-downloader", { recursive: true });
51
-
52
- for (let [src, dest] of files) {
53
- cpSync(src, dest);
54
- console.log(`Copied ${src} → ${dest}`);
55
- }
1
+ /*
2
+ * tsc emits the JavaScript into es/ but not the stylesheets the components import next to
3
+ * themselves. Copy every .css under src/ to the same path under es/, so a new component's
4
+ * stylesheet is published without anyone remembering a list.
5
+ */
6
+ import { cpSync, mkdirSync, readdirSync } from "node:fs";
7
+ import { dirname, join, relative } from "node:path";
8
+
9
+ function* cssFiles(dir) {
10
+ for (let entry of readdirSync(dir, { withFileTypes: true })) {
11
+ let path = join(dir, entry.name);
12
+ if (entry.isDirectory()) {
13
+ yield* cssFiles(path);
14
+ } else if (entry.name.endsWith(".css")) {
15
+ yield path;
16
+ }
17
+ }
18
+ }
19
+
20
+ let count = 0;
21
+ for (let src of cssFiles("src")) {
22
+ let dest = join("es", relative("src", src));
23
+ mkdirSync(dirname(dest), { recursive: true });
24
+ cpSync(src, dest);
25
+ count++;
26
+ }
27
+ console.log(`Copied ${count} stylesheets from src/ to es/`);
@@ -1,125 +1,129 @@
1
- .ObLookup-inputWrap {
2
- position: relative;
3
-
4
- .ds-input {
5
- padding-inline-end: var(--ObLookup-buttons-width, 3rem);
6
- }
7
- }
8
-
9
- .ObLookup-buttons {
10
- position: absolute;
11
- inset-inline-end: 0;
12
- inset-block-end: 0;
13
- /* Match the .ds-input height so the buttons center on the input row,
14
- also when a label or description is rendered above the input */
15
- height: var(--ds-size-12, 3rem);
16
- display: flex;
17
- align-items: center;
18
- padding-inline-end: var(--ds-size-1, 0.25rem);
19
- }
20
-
21
- .ObLookup-dialog {
22
- border: 0;
23
- margin-block-start: 0;
24
- padding: 1rem;
25
- overflow: hidden;
26
-
27
- background-color: whitesmoke;
28
-
29
- transition:
30
- display 0.2s allow-discrete,
31
- transform 0.2s ease-out,
32
- scale 0.2s ease-out,
33
- opacity 0.2s ease-out;
34
-
35
- &::backdrop {
36
- opacity: 0;
37
- background: rgb(0 0 0 / 0.2);
38
- transition:
39
- display 0.2s allow-discrete,
40
- opacity 0.2s ease-out;
41
- }
42
-
43
- &[open]::backdrop {
44
- opacity: 1;
45
-
46
- @starting-style {
47
- opacity: 0;
48
- }
49
- }
50
-
51
- @media (width < 768px) {
52
- inset: 10vh 0.5rem 0;
53
-
54
- border-radius: 1rem 1rem 0 0;
55
- height: 90vh;
56
- width: calc(100vw - 1rem);
57
- max-width: 100vw;
58
- transform: translateY(100%);
59
- z-index: 1500;
60
-
61
- opacity: 0;
62
-
63
- &[open] {
64
- transform: translateY(0);
65
- opacity: 1;
66
-
67
- @starting-style {
68
- transform: translateY(100%);
69
- opacity: 0;
70
- }
71
- }
72
- }
73
-
74
- @media (width >= 768px) {
75
- inset-block-start: 50%;
76
- inset-inline-start: 50%;
77
- translate: -50% -50%;
78
- scale: 1 0;
79
- opacity: 0;
80
-
81
- border-radius: 0.25rem;
82
-
83
- height: clamp(300px, 80vh, 500px);
84
- min-width: 320px;
85
- width: var(--default-width, 400px);
86
-
87
- &[open] {
88
- scale: 1;
89
- opacity: 1;
90
-
91
- @starting-style {
92
- scale: 1 0;
93
- opacity: 0;
94
- }
95
- }
96
- }
97
-
98
- @supports (inset-block-start: anchor(bottom)) {
99
- @media (width < 768px) or (pointer: coarse) {
100
- anchor-name: unset !important;
101
- }
102
-
103
- @media screen and (width >= 768px) and (pointer: fine) {
104
- inset-block-start: anchor(bottom);
105
- inset-block-end: unset;
106
-
107
- inset-inline-start: anchor(left);
108
- inset-inline-end: unset;
109
-
110
- translate: unset;
111
- transform-origin: top left;
112
-
113
- resize: both;
114
- }
115
- }
116
-
117
- &[data-anchor="manual"] {
118
- inset: unset;
119
- position: fixed;
120
- inset-inline-start: var(--lookup-anchor-inline-start, 50%);
121
- inset-block-start: var(--lookup-anchor-block-start, 50%);
122
- translate: unset;
123
- transform: none;
124
- }
125
- }
1
+ .ObLookup-inputWrap {
2
+ position: relative;
3
+
4
+ .ds-input {
5
+ padding-inline-end: var(--ObLookup-buttons-width, 3rem);
6
+ }
7
+ }
8
+
9
+ .ObLookup-labelTag {
10
+ margin-inline-start: var(--ds-size-2, 0.5rem);
11
+ }
12
+
13
+ .ObLookup-buttons {
14
+ position: absolute;
15
+ inset-inline-end: 0;
16
+ inset-block-end: 0;
17
+ /* Match the .ds-input height so the buttons center on the input row,
18
+ also when a label or description is rendered above the input */
19
+ height: var(--ds-size-12, 3rem);
20
+ display: flex;
21
+ align-items: center;
22
+ padding-inline-end: var(--ds-size-1, 0.25rem);
23
+ }
24
+
25
+ .ObLookup-dialog {
26
+ border: 0;
27
+ margin-block-start: 0;
28
+ padding: 1rem;
29
+ overflow: hidden;
30
+
31
+ background-color: whitesmoke;
32
+
33
+ transition:
34
+ display 0.2s allow-discrete,
35
+ transform 0.2s ease-out,
36
+ scale 0.2s ease-out,
37
+ opacity 0.2s ease-out;
38
+
39
+ &::backdrop {
40
+ opacity: 0;
41
+ background: rgb(0 0 0 / 0.2);
42
+ transition:
43
+ display 0.2s allow-discrete,
44
+ opacity 0.2s ease-out;
45
+ }
46
+
47
+ &[open]::backdrop {
48
+ opacity: 1;
49
+
50
+ @starting-style {
51
+ opacity: 0;
52
+ }
53
+ }
54
+
55
+ @media (width < 768px) {
56
+ inset: 10vh 0.5rem 0;
57
+
58
+ border-radius: 1rem 1rem 0 0;
59
+ height: 90vh;
60
+ width: calc(100vw - 1rem);
61
+ max-width: 100vw;
62
+ transform: translateY(100%);
63
+ z-index: 1500;
64
+
65
+ opacity: 0;
66
+
67
+ &[open] {
68
+ transform: translateY(0);
69
+ opacity: 1;
70
+
71
+ @starting-style {
72
+ transform: translateY(100%);
73
+ opacity: 0;
74
+ }
75
+ }
76
+ }
77
+
78
+ @media (width >= 768px) {
79
+ inset-block-start: 50%;
80
+ inset-inline-start: 50%;
81
+ translate: -50% -50%;
82
+ scale: 1 0;
83
+ opacity: 0;
84
+
85
+ border-radius: 0.25rem;
86
+
87
+ height: clamp(300px, 80vh, 500px);
88
+ min-width: 320px;
89
+ width: var(--default-width, 400px);
90
+
91
+ &[open] {
92
+ scale: 1;
93
+ opacity: 1;
94
+
95
+ @starting-style {
96
+ scale: 1 0;
97
+ opacity: 0;
98
+ }
99
+ }
100
+ }
101
+
102
+ @supports (inset-block-start: anchor(bottom)) {
103
+ @media (width < 768px) or (pointer: coarse) {
104
+ anchor-name: unset !important;
105
+ }
106
+
107
+ @media screen and (width >= 768px) and (pointer: fine) {
108
+ inset-block-start: anchor(bottom);
109
+ inset-block-end: unset;
110
+
111
+ inset-inline-start: anchor(left);
112
+ inset-inline-end: unset;
113
+
114
+ translate: unset;
115
+ transform-origin: top left;
116
+
117
+ resize: both;
118
+ }
119
+ }
120
+
121
+ &[data-anchor="manual"] {
122
+ inset: unset;
123
+ position: fixed;
124
+ inset-inline-start: var(--lookup-anchor-inline-start, 50%);
125
+ inset-block-start: var(--lookup-anchor-block-start, 50%);
126
+ translate: unset;
127
+ transform: none;
128
+ }
129
+ }