@threadlabs/looma 0.11.2 → 0.11.3

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threadlabs/looma",
3
- "version": "0.11.2",
3
+ "version": "0.11.3",
4
4
  "type": "module",
5
5
  "description": "Looma components as HTML, Vue, and plain DOM, with design tokens.",
6
6
  "license": "MIT",
@@ -201,7 +201,7 @@
201
201
  /* A hovered row reads its whole name: the label slides far enough to show the end, waits
202
202
  there, and comes back. Only when it actually overflows — the controller measures by how
203
203
  much — after the controls have taken their place over its end — and hands over the distance
204
- and a duration from it, so a longer name travels no faster. */
204
+ and a duration from it, so every name moves at the same speed. */
205
205
  .row[data-ui-marquee] > .label > .label-text {
206
206
  /* Once, and it stays at the end while the pointer is there: a name that keeps sliding back
207
207
  and forth under the pointer is harder to read than one that arrives and holds. */
@@ -424,7 +424,7 @@
424
424
  /* A hovered row reads its whole name: the label slides far enough to show the end, waits
425
425
  there, and comes back. Only when it actually overflows — the controller measures by how
426
426
  much — after the controls have taken their place over its end — and hands over the distance
427
- and a duration from it, so a longer name travels no faster. */
427
+ and a duration from it, so every name moves at the same speed. */
428
428
 
429
429
  /* This comes after the hover fade, which it replaces at the same specificity. While the name
430
430
  slides, the label reaches back under the icon (the controller measures how far) with its text
@@ -378,7 +378,7 @@ useComponentHost(controllerModule.default, {
378
378
  /* A hovered row reads its whole name: the label slides far enough to show the end, waits
379
379
  there, and comes back. Only when it actually overflows — the controller measures by how
380
380
  much — after the controls have taken their place over its end — and hands over the distance
381
- and a duration from it, so a longer name travels no faster. */
381
+ and a duration from it, so every name moves at the same speed. */
382
382
  .row[data-ui-marquee] > .label > .label-text {
383
383
  /* Once, and it stays at the end while the pointer is there: a name that keeps sliding back
384
384
  and forth under the pointer is harder to read than one that arrives and holds. */
@@ -234,6 +234,6 @@ var UiTreeItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
234
234
  ], 16, _hoisted_1);
235
235
  };
236
236
  }
237
- }), [["__scopeId", "data-v-3778b642"]]);
237
+ }), [["__scopeId", "data-v-dab96891"]]);
238
238
  //#endregion
239
239
  export { UiTreeItem_default as t };
@@ -5080,7 +5080,7 @@ to {
5080
5080
  display: none;
5081
5081
  }
5082
5082
 
5083
- [data-component~="ui-tree-item"][data-v-3778b642] {
5083
+ [data-component~="ui-tree-item"][data-v-dab96891] {
5084
5084
  --_tree-row-min-height: 32px;
5085
5085
  --_tree-disclosure-size: 16px;
5086
5086
 
@@ -5089,7 +5089,7 @@ to {
5089
5089
  min-inline-size: 0;
5090
5090
  margin-inline-start: calc(var(--ui-tree-item-depth, 0) * var(--ui-tree-indent, 16px));
5091
5091
  }
5092
- .row[data-v-3778b642] {
5092
+ .row[data-v-dab96891] {
5093
5093
  position: relative;
5094
5094
  display: grid;
5095
5095
  grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr);
@@ -5106,38 +5106,38 @@ to {
5106
5106
  box-shadow var(--ui-motion-fast) var(--ui-motion-ease),
5107
5107
  min-block-size var(--ui-motion-base) var(--ui-motion-ease);
5108
5108
  }
5109
- .row[data-v-3778b642]:hover,
5110
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] .row[data-v-3778b642],
5111
- .row[data-v-3778b642]:focus-within {
5109
+ .row[data-v-dab96891]:hover,
5110
+ [data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] .row[data-v-dab96891],
5111
+ .row[data-v-dab96891]:focus-within {
5112
5112
  color: var(--ui-text-primary);
5113
5113
  background: var(--ui-surface-muted);
5114
5114
  }
5115
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="disabled"] .row[data-v-3778b642] {
5115
+ [data-component~="ui-tree-item"][data-ui-tree-item-state~="disabled"] .row[data-v-dab96891] {
5116
5116
  opacity: 0.55;
5117
5117
  }
5118
- [data-component~="ui-tree-item"][data-dragging] .row[data-v-3778b642] {
5118
+ [data-component~="ui-tree-item"][data-dragging] .row[data-v-dab96891] {
5119
5119
  opacity: 0.42;
5120
5120
  }
5121
- [data-component~="ui-tree-item"][data-v-3778b642]:focus {
5121
+ [data-component~="ui-tree-item"][data-v-dab96891]:focus {
5122
5122
  outline: none;
5123
5123
  }
5124
- [data-component~="ui-tree-item"]:focus-visible .row[data-v-3778b642] {
5124
+ [data-component~="ui-tree-item"]:focus-visible .row[data-v-dab96891] {
5125
5125
  box-shadow: 0 0 0 2px var(--ui-focus-ring);
5126
5126
  }
5127
5127
 
5128
5128
  /* Child combinators: drop feedback belongs to this item's own row, not the rows nested in it. */
5129
- [data-component~="ui-tree-item"][data-drop-position="inside"] > .row[data-v-3778b642] {
5129
+ [data-component~="ui-tree-item"][data-drop-position="inside"] > .row[data-v-dab96891] {
5130
5130
  background: var(--ui-accent-subtle);
5131
5131
  box-shadow: inset 0 0 0 1px var(--ui-tree-drop-color, var(--ui-accent-solid));
5132
5132
  }
5133
- .disclosure[data-v-3778b642],
5134
- .disclosure-spacer[data-v-3778b642] {
5133
+ .disclosure[data-v-dab96891],
5134
+ .disclosure-spacer[data-v-dab96891] {
5135
5135
  grid-column: 1;
5136
5136
  grid-row: 1;
5137
5137
  inline-size: var(--_tree-disclosure-size);
5138
5138
  block-size: 28px;
5139
5139
  }
5140
- .disclosure[data-v-3778b642] {
5140
+ .disclosure[data-v-dab96891] {
5141
5141
  display: grid;
5142
5142
  /* Start-aligned: the chevron's ink, not its hit area, aligns with the content above it. */
5143
5143
  place-items: center start;
@@ -5148,14 +5148,14 @@ to {
5148
5148
  border-radius: var(--ui-radius-sm);
5149
5149
  cursor: pointer;
5150
5150
  }
5151
- .disclosure[hidden][data-v-3778b642] {
5151
+ .disclosure[hidden][data-v-dab96891] {
5152
5152
  display: none;
5153
5153
  }
5154
- .disclosure[data-v-3778b642]:hover {
5154
+ .disclosure[data-v-dab96891]:hover {
5155
5155
  color: var(--ui-text-primary);
5156
5156
  background: var(--ui-surface-elevated);
5157
5157
  }
5158
- .disclosure-icon[data-v-3778b642] {
5158
+ .disclosure-icon[data-v-dab96891] {
5159
5159
  display: grid;
5160
5160
  place-items: center;
5161
5161
  inline-size: 12px;
@@ -5163,7 +5163,7 @@ to {
5163
5163
  transform: rotate(-90deg);
5164
5164
  transition: transform var(--ui-motion-fast) var(--ui-motion-ease);
5165
5165
  }
5166
- .disclosure-icon[data-v-3778b642]::before {
5166
+ .disclosure-icon[data-v-dab96891]::before {
5167
5167
  display: block;
5168
5168
  inline-size: 0.375rem;
5169
5169
  block-size: 0.375rem;
@@ -5173,19 +5173,19 @@ to {
5173
5173
  /* A chevron's ink sits below its box centre; lift it so it centres optically (in either rotation). */
5174
5174
  transform: translateY(-20%) rotate(45deg);
5175
5175
  }
5176
- [data-component~="ui-tree-item"][aria-expanded="true"] .disclosure-icon[data-v-3778b642] {
5176
+ [data-component~="ui-tree-item"][aria-expanded="true"] .disclosure-icon[data-v-dab96891] {
5177
5177
  transform: rotate(0deg);
5178
5178
  }
5179
5179
 
5180
5180
  /* Lucide grip-vertical, filling the handle as in Looma 0.2. */
5181
- .drag-handle svg[data-v-3778b642] {
5181
+ .drag-handle svg[data-v-dab96891] {
5182
5182
  display: block;
5183
5183
  inline-size: 100%;
5184
5184
  block-size: 100%;
5185
5185
  }
5186
5186
 
5187
5187
  /* Slotted content is outside this scope, so :has() cannot see it; hide only a truly empty slot. */
5188
- .leading[data-v-3778b642] {
5188
+ .leading[data-v-dab96891] {
5189
5189
  display: inline-grid;
5190
5190
  place-items: center;
5191
5191
  grid-column: 2;
@@ -5198,12 +5198,12 @@ to {
5198
5198
  position: relative;
5199
5199
  z-index: 1;
5200
5200
  }
5201
- .leading[data-v-3778b642]:empty {
5201
+ .leading[data-v-dab96891]:empty {
5202
5202
  display: none;
5203
5203
  }
5204
5204
 
5205
5205
  /* Icons match the label's size (as in Knit's tree): an unsized SVG would otherwise render 300×150. */
5206
- svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5206
+ svg[data-v-dab96891-s],img[data-v-dab96891-s] {
5207
5207
  display: block;
5208
5208
  inline-size: 1em;
5209
5209
  block-size: 1em;
@@ -5212,7 +5212,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5212
5212
 
5213
5213
  /* The label spans the row's height and centres its content, so slotted content (a link) can
5214
5214
  stretch to fill the row as its own hit area; the padding tokens remove the inset. */
5215
- .label[data-v-3778b642] {
5215
+ .label[data-v-dab96891] {
5216
5216
  grid-column: 3;
5217
5217
  grid-row: 1;
5218
5218
  align-self: stretch;
@@ -5230,7 +5230,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5230
5230
 
5231
5231
  /* Slotted label content fills the cell, so a link is the row's hit area rather than sizing to
5232
5232
  its own text and reading as overflow. */
5233
- .label-text[data-v-3778b642] {
5233
+ .label-text[data-v-dab96891] {
5234
5234
  display: flex;
5235
5235
  align-items: center;
5236
5236
  /* Stretches, so slotted content can still be the row's full-height hit area. */
@@ -5240,15 +5240,15 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5240
5240
  inline-size: 100%;
5241
5241
  white-space: nowrap;
5242
5242
  }
5243
- .label-text > [data-v-3778b642-s] {
5243
+ .label-text > [data-v-dab96891-s] {
5244
5244
  flex: 1 1 auto;
5245
5245
  min-inline-size: 0;
5246
5246
  }
5247
5247
 
5248
5248
  /* The controls sit over the label's end, so the text fades out where they begin. The fade is
5249
5249
  the truncation mark while it shows: an ellipsis under it would read as a second one. */
5250
- .row:hover > .label[data-v-3778b642],
5251
- .row:focus-within > .label[data-v-3778b642] {
5250
+ .row:hover > .label[data-v-dab96891],
5251
+ .row:focus-within > .label[data-v-dab96891] {
5252
5252
  text-overflow: clip;
5253
5253
  mask-image: linear-gradient(
5254
5254
  to right,
@@ -5256,8 +5256,8 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5256
5256
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
5257
5257
  );
5258
5258
  }
5259
- .row:hover > .label[data-v-3778b642]:dir(rtl),
5260
- .row:focus-within > .label[data-v-3778b642]:dir(rtl) {
5259
+ .row:hover > .label[data-v-dab96891]:dir(rtl),
5260
+ .row:focus-within > .label[data-v-dab96891]:dir(rtl) {
5261
5261
  mask-image: linear-gradient(
5262
5262
  to left,
5263
5263
  #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
@@ -5268,11 +5268,11 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5268
5268
  /* A hovered row reads its whole name: the label slides far enough to show the end, waits
5269
5269
  there, and comes back. Only when it actually overflows — the controller measures by how
5270
5270
  much — after the controls have taken their place over its end — and hands over the distance
5271
- and a duration from it, so a longer name travels no faster. */
5272
- .row[data-ui-marquee] > .label > .label-text[data-v-3778b642] {
5271
+ and a duration from it, so every name moves at the same speed. */
5272
+ .row[data-ui-marquee] > .label > .label-text[data-v-dab96891] {
5273
5273
  /* Once, and it stays at the end while the pointer is there: a name that keeps sliding back
5274
5274
  and forth under the pointer is harder to read than one that arrives and holds. */
5275
- animation: ui-tree-item-marquee-3778b642 var(--_marquee-duration) linear 0.5s 1 normal forwards;
5275
+ animation: ui-tree-item-marquee-dab96891 var(--_marquee-duration) linear 0.5s 1 normal forwards;
5276
5276
  will-change: transform;
5277
5277
  }
5278
5278
 
@@ -5280,7 +5280,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5280
5280
  slides, the label reaches back under the icon (the controller measures how far) with its text
5281
5281
  where it was, and fades out across that stretch, gone by the icon's middle: the name slips
5282
5282
  under the icon rather than stopping at a hard edge beside it. */
5283
- .row[data-ui-marquee] > .label[data-v-3778b642] {
5283
+ .row[data-ui-marquee] > .label[data-v-dab96891] {
5284
5284
  margin-inline-start: calc(-1 * var(--_marquee-lead, 0px));
5285
5285
  padding-inline-start: calc(
5286
5286
  var(--_marquee-lead, 0px) + var(--ui-tree-item-label-padding-inline, var(--ui-space-2))
@@ -5295,7 +5295,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5295
5295
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
5296
5296
  );
5297
5297
  }
5298
- .row[data-ui-marquee] > .label[data-v-3778b642]:dir(rtl) {
5298
+ .row[data-ui-marquee] > .label[data-v-dab96891]:dir(rtl) {
5299
5299
  mask-image: linear-gradient(
5300
5300
  to left,
5301
5301
  transparent calc(var(--_marquee-lead, 0px) / 2),
@@ -5306,7 +5306,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5306
5306
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
5307
5307
  );
5308
5308
  }
5309
- @keyframes ui-tree-item-marquee-3778b642 {
5309
+ @keyframes ui-tree-item-marquee-dab96891 {
5310
5310
  from {
5311
5311
  transform: translateX(0);
5312
5312
  }
@@ -5317,15 +5317,15 @@ to {
5317
5317
 
5318
5318
  /* Reduced motion keeps the fade, which already says the name continues. */
5319
5319
  @media (prefers-reduced-motion: reduce) {
5320
- .row[data-ui-marquee] > .label > .label-text[data-v-3778b642] {
5320
+ .row[data-ui-marquee] > .label > .label-text[data-v-dab96891] {
5321
5321
  animation: none;
5322
5322
  }
5323
5323
  }
5324
- .row:hover > .label > [data-v-3778b642-s],
5325
- .row:focus-within > .label > [data-v-3778b642-s] {
5324
+ .row:hover > .label > [data-v-dab96891-s],
5325
+ .row:focus-within > .label > [data-v-dab96891-s] {
5326
5326
  text-overflow: clip;
5327
5327
  }
5328
- .actions[data-v-3778b642] {
5328
+ .actions[data-v-dab96891] {
5329
5329
  position: absolute;
5330
5330
  z-index: 1;
5331
5331
  inset-block: 0;
@@ -5337,18 +5337,18 @@ to {
5337
5337
  pointer-events: none;
5338
5338
  transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
5339
5339
  }
5340
- .row:hover > .actions[data-v-3778b642],
5341
- .row:focus-within > .actions[data-v-3778b642] {
5340
+ .row:hover > .actions[data-v-dab96891],
5341
+ .row:focus-within > .actions[data-v-dab96891] {
5342
5342
  opacity: 1;
5343
5343
  pointer-events: auto;
5344
5344
  }
5345
5345
 
5346
5346
  /* Without hover there is no reveal, so the controls keep their own column. */
5347
5347
  @media (hover: none) {
5348
- .row[data-v-3778b642] {
5348
+ .row[data-v-dab96891] {
5349
5349
  grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr) auto;
5350
5350
  }
5351
- .actions[data-v-3778b642] {
5351
+ .actions[data-v-dab96891] {
5352
5352
  position: static;
5353
5353
  grid-column: 4;
5354
5354
  grid-row: 1;
@@ -5363,7 +5363,7 @@ to {
5363
5363
  empty column, right before the icon; a branch's disclosure is there, so its handle sits just
5364
5364
  outside the row. It is bare until pointed at: a resting surface behind it read as a faint
5365
5365
  patch rather than as a control. */
5366
- .drag-handle[data-v-3778b642] {
5366
+ .drag-handle[data-v-dab96891] {
5367
5367
  position: absolute;
5368
5368
  z-index: 2;
5369
5369
  inset-block-start: 50%;
@@ -5384,24 +5384,24 @@ to {
5384
5384
  transform: translateY(-50%);
5385
5385
  transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
5386
5386
  }
5387
- .row:hover .drag-handle[data-v-3778b642],
5388
- .drag-handle[data-v-3778b642]:hover,
5389
- .drag-handle[data-v-3778b642]:focus-visible,
5390
- [data-component~="ui-tree-item"][data-dragging] > .row > .drag-handle[data-v-3778b642] {
5387
+ .row:hover .drag-handle[data-v-dab96891],
5388
+ .drag-handle[data-v-dab96891]:hover,
5389
+ .drag-handle[data-v-dab96891]:focus-visible,
5390
+ [data-component~="ui-tree-item"][data-dragging] > .row > .drag-handle[data-v-dab96891] {
5391
5391
  opacity: 1;
5392
5392
  }
5393
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"] > .row > .drag-handle[data-v-3778b642] {
5393
+ [data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"] > .row > .drag-handle[data-v-dab96891] {
5394
5394
  inset-inline-start: calc(-1 * var(--_tree-disclosure-size) - 2px);
5395
5395
  }
5396
- .drag-handle[data-v-3778b642]:hover,
5397
- .drag-handle[data-v-3778b642]:focus-visible {
5396
+ .drag-handle[data-v-dab96891]:hover,
5397
+ .drag-handle[data-v-dab96891]:focus-visible {
5398
5398
  color: var(--ui-text-primary);
5399
5399
  background: var(--ui-surface-hover);
5400
5400
  }
5401
- .drag-handle[data-v-3778b642]:active {
5401
+ .drag-handle[data-v-dab96891]:active {
5402
5402
  cursor: grabbing;
5403
5403
  }
5404
- .drop-indicator[data-v-3778b642] {
5404
+ .drop-indicator[data-v-dab96891] {
5405
5405
  position: absolute;
5406
5406
  z-index: 3;
5407
5407
  inset-inline: 1px;
@@ -5411,8 +5411,8 @@ to {
5411
5411
  background: var(--ui-tree-drop-color, var(--ui-accent-solid));
5412
5412
  pointer-events: none;
5413
5413
  }
5414
- .drop-indicator[data-v-3778b642]::before,
5415
- .drop-indicator[data-v-3778b642]::after {
5414
+ .drop-indicator[data-v-dab96891]::before,
5415
+ .drop-indicator[data-v-dab96891]::after {
5416
5416
  content: "";
5417
5417
  position: absolute;
5418
5418
  inset-block-start: 50%;
@@ -5423,39 +5423,39 @@ to {
5423
5423
  background: var(--ui-surface-elevated);
5424
5424
  transform: translateY(-50%);
5425
5425
  }
5426
- .drop-indicator[data-v-3778b642]::before {
5426
+ .drop-indicator[data-v-dab96891]::before {
5427
5427
  inset-inline-start: -1px;
5428
5428
  }
5429
- .drop-indicator[data-v-3778b642]::after {
5429
+ .drop-indicator[data-v-dab96891]::after {
5430
5430
  inset-inline-end: -1px;
5431
5431
  }
5432
- [data-component~="ui-tree-item"][data-drop-position="before"] > .row > .row-drop-indicator[data-v-3778b642] {
5432
+ [data-component~="ui-tree-item"][data-drop-position="before"] > .row > .row-drop-indicator[data-v-dab96891] {
5433
5433
  display: block;
5434
5434
  inset-block-start: -1px;
5435
5435
  }
5436
- [data-component~="ui-tree-item"][data-drop-position="after"] > .subtree-drop-indicator[data-v-3778b642] {
5436
+ [data-component~="ui-tree-item"][data-drop-position="after"] > .subtree-drop-indicator[data-v-dab96891] {
5437
5437
  display: block;
5438
5438
  inset-block-end: -1px;
5439
5439
  }
5440
- .children[hidden][data-v-3778b642] {
5440
+ .children[hidden][data-v-dab96891] {
5441
5441
  display: none;
5442
5442
  }
5443
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"][data-v-3778b642] {
5443
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"][data-v-dab96891] {
5444
5444
  --_tree-row-min-height: 44px;
5445
5445
  }
5446
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .drag-handle[data-v-3778b642] {
5446
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .drag-handle[data-v-dab96891] {
5447
5447
  display: none;
5448
5448
  }
5449
5449
  @media (prefers-reduced-motion: reduce) {
5450
- .row[data-v-3778b642],
5451
- .disclosure-icon[data-v-3778b642],
5452
- .drag-handle[data-v-3778b642] {
5450
+ .row[data-v-dab96891],
5451
+ .disclosure-icon[data-v-dab96891],
5452
+ .drag-handle[data-v-dab96891] {
5453
5453
  transition: none;
5454
5454
  }
5455
5455
  }
5456
5456
 
5457
5457
  /* A component that sets its display still honours the hidden attribute on its root. */
5458
- [data-component~="ui-tree-item"][hidden][data-v-3778b642] {
5458
+ [data-component~="ui-tree-item"][hidden][data-v-dab96891] {
5459
5459
  display: none;
5460
5460
  }
5461
5461
  /**